English 中文(简体)
只串行 xml 文件的一部分并保存它
原标题:Serialize only a part of xml file and save it

我对 XML 序列化有问题。 我将尝试用以下的 Xml 示例文件解释它 。

<AutoExpo>
  <Details>
    <Venue>XYZ</Venue>
    <StartTime>09:00</StartTime>
    <EndTime>21:00</EndTime>
  </Details>

  <Cars>
      <Car>
        <Company>Chevrolet</Company>
        <Model>Cruz</Model>
        <Color>Red</Color>
      </Car>

      <Car>
        <Company>Ford</Company>
        <Model>Fiesta</Model>
        <Color>Blue</Color>
      </Car>

  </Cars>
</AutoExpo>

当我读这个 xml 文件时, 我将汽车解序成物体。 汽车列表可以是巨大的。 我的代码使用这些物件, 可以改变一些汽车的特性。 如果我想将属性发生变化的汽车物件序列化, 回到 xml 文件, 保存下来, 这样下次当我的代码启动时, 它就会收到最新的状态信息 。

问题回答

很难在 XML 文件中跳动, 更改属性, 无论这些属性在哪里改变。 您应该将整个文件读入记忆中, 当你保存时, 写出整个文件, 覆盖旧文件 。

XML并不是一个可怕的方法,但据我所知,一个 SQL 服务器( 或其他 RDBMS ) 数据库会更合适。 您不必担心这样的问题, 因为 DB 引擎会为您这样做 。

虽然这不是最好的解决方案,但一个可能可行的选项是将编辑过的列表序列成一个分隔文件,并在代码中比较这两个文件。如果对信息没有做任何修改,则两个文本文件应该完全相同。如果不是,你可以用新文件替换旧文件。最简单的办法是,而不是将文件序列化并读写/写成文件,也许把它发送到流中比较。

当一个对象序列化时,它会生成整个 XML 文档。所以,如果你保存到一个文件,它会覆盖文件的先前内容。因此,如果你想让由此产生的文件包含所有汽车,包括但不限于修改过的汽车,那么你需要将整个事情序列化。如果你只对修改过的汽车进行序列化,文件就会丢失所有没有修改的汽车。如果你真的想要将已经修改的汽车序列化,我建议创建一个新的 AutoExpo 对象实例,并且只将您想要保存的汽车插入其中,然后将该对象的序列化为仅部分列表。

如果您需要修改 XML 中的单个元素而不触动其余元素, 因为数据太大, XML 不是一个好选择 。 我建议代之以建立一个关联数据库 。 或者, 您可以将每辆车存储为自己的 XML 文件, 并仅按需要单独装入并保存每辆车 。

您不能用 XML 做到这一点。 考虑使用关系数据库。 关系数据库有一个内置的文件空间管理机制, 允许完全按您需要做。 您可以更新单个记录, 添加和删除记录 。

Jet.mdb 数据库( Access) 是替换 XML-File 的好选择。 您可以通过 OLEDB 访问该数据库, 限制应用程序必须编译32 位。 访问不需要安装 。

首先,你们实体必须有独特的识别资料。

<AutoExpo>
  <Details>
    <Venue>XYZ</Venue>
    <StartTime>09:00</StartTime>
    <EndTime>21:00</EndTime>
  </Details>

  <Cars>
    <Car id="1">
      <Company>Chevrolet</Company>
      <Model>Cruz</Model>
      <Color>Red</Color>
    </Car>
    <Car id="2">
      <Company>Ford</Company>
      <Model>Fiesta</Model>
      <Color>Blue</Color>
    </Car>
  </Cars>
</AutoExpo>

现在您可以使用 XPath 选择那些需要更新和修改内容的节点 。

  1. load the document into an XDocument
  2. find a car: document.Element("Car[id=2]")
  3. set the new value: element.Element("Color").Value = "Black"

However, the downside of using a file-based storage remains. You still have to load the whole file into memory and write it back to the hard drive when you re down updating, but you do not have to serialize all Car objects. I can t think of an easy way to stream the file from hard drive and manipulate it in one go.





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签