C# 仅序列化xml文件的一部分并保存它
我在XML序列化方面有一个问题。我将尝试用下面的示例xml文件来解释它C# 仅序列化xml文件的一部分并保存它,c#,xml-serialization,C#,Xml Serialization,我在XML序列化方面有一个问题。我将尝试用下面的示例xml文件来解释它 <AutoExpo> <Details> <Venue>XYZ</Venue> <StartTime>09:00</StartTime> <EndTime>21:00</EndTime> </Details> <Cars> <Car>
<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>
XYZ
09:00
21:00
雪佛兰
克鲁兹
红色
河流浅水处
嘉年华
蓝色
现在,当我读取这个xml文件时,我将汽车反序列化为对象。汽车清单可能是巨大的。我的代码使用这些对象,可以更改某些汽车的属性。现在,如果我只想序列化那些属性已更改的car对象,返回到xml文件并保存它,以便下次代码启动时获得最新的状态信息,该怎么办 尽管这可能不是最好的解决方案,但一个可能可行的选择是将已编辑的列表序列化为一个单独的文件,并在代码中比较这两个文件。如果信息没有任何更改,则两个文本文件应相同。如果没有,可以用新文件替换旧文件。最简单的方法是,与其序列化为文件并读/写,不如将其发送到流并进行比较。序列化对象时,它会生成整个XML文档。因此,如果将其保存到文件中,它将覆盖该文件以前的内容。因此,如果希望生成的文件包含所有汽车,包括但不限于修改后的汽车,则需要序列化整个文件。如果您只序列化更改的车辆,则该文件将丢失所有未更改的车辆。如果您确实只想序列化已更改的汽车,我建议您创建AutoExpo对象的新实例,并仅将要保存的汽车插入其中,然后仅使用部分列表序列化该对象
如果因为数据太大而只需要修改XML中的单个元素而不涉及其余元素,那么XML不是一个好的选择。我建议改为使用关系数据库。或者,您可以将每辆车存储为自己的XML文件,并根据需要单独加载和保存每辆车。您不能使用XML来实现这一点。考虑使用关系数据库。关系数据库有一个内置的文件空间管理机制,允许您精确地执行所需的操作。您可以更新单个记录、添加和删除记录
mdb数据库(Access)是替换XML文件的一个很好的候选者。您可以通过OLEDB访问它,但应用程序必须编译为32位。Access不需要安装。在XML文件中到处切换属性是相当困难的,无论它们在哪里更改。您应该将整个文件读入内存,保存时,写出整个内容,覆盖旧文件
XML并不是一种很糟糕的方法,但从这个问题中我可以看出,SQL Server(或其他RDBMS)数据库更合适。您不必担心这样的问题,因为DB引擎将为您解决这些问题。首先,您的实体必须具有唯一的标识符
<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>
XYZ
09:00
21:00
雪佛兰
克鲁兹
红色
河流浅水处
嘉年华
蓝色
现在,您可以使用XPath选择需要更新的节点并更改其内容
我想不出一个简单的方法来从硬盘上传输文件并一次操作它。另一个解决方案可能是将更改保存到一个文件中,然后不时创建快照。事实上,您必须解析多个文件(最新快照加上所有更改)才能“打开”数据库。PS:正如其他人所建议的,看一看关系数据库,或者看一个基于XML的数据库,它可能有助于迁移数据。