【发布时间】:2011-06-24 12:28:52
【问题描述】:
我有两个 XML 文件,我想将这两个文件合并为一个。 但是怎么做?我已经尝试了很多,但没有任何帮助。 如您所见,如果合并后的 XML 来自第一个 XML,那么它会留下来自第二个属性的文本。 其次,元素必须按第一个属性的 Id/Name/whatevername 排序。 第三,如果 XML 2 中不存在节点,则必须在与 XML 1 相同的位置创建它。
这里显示的 XML 文件只是整个 XML 的一个片段,还有很多属性名称。
如何用 C# 做到这一点?
XML 1
<APPLICATION>
<AC>
<CLASS Name="Hello1" Capt="do1"/>
<CLASS Name="Hello2" Capt="do2"/>
<CLASS Name="Hello5" Capt="do5"/>
<CLASS Name="Hello8" Capt="do8"/>
</AC>
<BO>
<ITEM Id="1" DefaultValue="name1"/>
<ITEM Id="3" DefaultValue="name3"/>
<ITEM Id="11" DefaultValue="name11"/>
<ITEM Id="12" DefaultValue="name12">
<VAL>
<REASON Id="Job1" SecondOne="Hallo"/>
</VAL>
</ITEM>
</BO>
<POP Id="Green" Value="Monster"/>
<POP Id="Blue" Value="Doggie"/>
XML 2
<APPLICATION>
<AC>
<CLASS Name="Hello1" Capt="dodo1"/>
<CLASS Name="Hello2" Capt="dodo2"/>
<CLASS Name="Hello3" Capt="dodo3"/>
<CLASS Name="Hello9" Capt="dodo9"/>
</AC>
<CARS Wheel="Fore" Default="45x255xZ"/>
<CARS Wheel="BACK" Default="45x255xZ"/>
<CARS Wheel="SPARE" Default="45x255xZ"/>
<BO>
<ITEM Id="1" DefaultValue="namename1"/>
<ITEM Id="3" DefaultValue=""/>
<ITEM Id="9" DefaultValue="name11"/>
<ITEM Id="10" DefaultValue="name12">
<VAL>
<REASON Id="Job1" SecondOne="Hallo"/>
</VAL>
</ITEM>
</BO>
合并后的 XML 应该如下所示:
<APPLICATION>
<AC>
<CLASS Name="Hello1" Capt="dodo1"/>
<CLASS Name="Hello2" Capt="dodo2"/>
<CLASS Name="Hello3" Capt="dodo3"/>
<CLASS Name="Hello5" Capt=""/>
<CLASS Name="Hello8" Capt=""/>
<CLASS Name="Hello9" Capt="dodo9"/>
</AC>
<CARS Wheel="Fore" Default="45x255xZ"/>
<CARS Wheel="BACK" Default="45x255xZ"/>
<CARS Wheel="SPARE" Default="45x255xZ"/>
<BO>
<ITEM Id="1" DefaultValue="namename1"/>
<ITEM Id="3" DefaultValue=""/>
<ITEM Id="9" DefaultValue="name11"/>
<ITEM Id="10" DefaultValue="name12">
<VAL>
<REASON Id="Job1" SecondOne="Hallo"/>
</VAL>
</ITEM>
<ITEM Id="11" DefaultValue=""/>
<ITEM Id="12" DefaultValue="">
<VAL>
<REASON Id="Job1" SecondOne=""/>
</VAL>
</ITEM>
</BO>
<POP Id="Green" Value=""/>
<POP Id="Blue" Value=""/>
感谢所有答案,但我仍然有一个问题,我不知道标记名是如何的,所以我无法对标记进行硬编码。
我只需要给你一个例子就可以了。但是下次我得到我的 XML 文件时,上面的标签可能会完全不同。这就是问题所在。所以不能说new XElement("BO", boChildren),因为下次这个标签就不存在了。
或者我不能硬编码这个 ==> var cars = xDocuments.SelectMany(x => x.Root.Elements("CARS")).Merge();因为下次我获取 XML 文件时,“CARS”不再存在。
【问题讨论】: