基于C# XDocument对比两个XML文件并实现匹配追加操作
C#中使用XDocument匹配并追加XML条目方案
嘿,我来帮你搞定这个XML处理的需求!咱们一步步来实现:加载两个固定路径的XML文件,通过<Code>和<ID>的匹配值,把第一个XML里的条目追加到第二个对应节点中。
步骤1:定义XML结构与加载文件
首先,假设第一个XML(比如叫deviceData.xml)的完整结构大概是这样(补全你给出的片段):
<root> <body> <Code>0000890</Code> <Device_Name>Device1</Device_Name> <Time>11:06:18.836 </Time> </body> <body> <Code>0000891</Code> <Device_Name>Device2</Device_Name> <Time>11:07:20.123 </Time> </body> </root>
第二个XML(比如叫masterData.xml)的结构类似:
<items> <item> <ID>0000890</ID> <Description>Sample Device</Description> </item> <item> <ID>0000891</ID> <Description>Another Device</Description> </item> </items>
咱们用XDocument加载这两个文件,同时处理文件不存在的异常:
using System; using System.Xml.Linq; class XmlProcessor { static void Main() { // 固定文件路径 string deviceXmlPath = @"C:\YourFixedPath\deviceData.xml"; string masterXmlPath = @"C:\YourFixedPath\masterData.xml"; try { // 加载两个XML文档 XDocument deviceDoc = XDocument.Load(deviceXmlPath); XDocument masterDoc = XDocument.Load(masterXmlPath);
步骤2:提取并匹配条目
接下来,咱们把第一个XML里的所有<body>节点提取出来,遍历每个节点,用<Code>的值去第二个XML里找对应的<ID>节点:
// 遍历第一个XML的所有body节点 foreach (XElement bodyNode in deviceDoc.Descendants("body")) { string codeValue = bodyNode.Element("Code")?.Value.Trim(); if (string.IsNullOrEmpty(codeValue)) continue; // 跳过Code为空的无效条目 // 在第二个XML中查找匹配ID的节点 XElement matchingItem = masterDoc.Descendants("item") .FirstOrDefault(item => item.Element("ID")?.Value.Trim() == codeValue); if (matchingItem != null) { // 把Device_Name和Time节点追加到匹配的item下 matchingItem.Add( new XElement("Device_Name", bodyNode.Element("Device_Name")?.Value.Trim()), new XElement("Time", bodyNode.Element("Time")?.Value.Trim()) ); } else { Console.WriteLine($"未找到匹配ID: {codeValue}的节点"); } }
步骤3:保存修改后的XML
最后,把修改后的第二个XML保存回去:
// 保存修改后的主XML文件 masterDoc.Save(masterXmlPath); Console.WriteLine("XML条目追加完成!"); } catch (Exception ex) { Console.WriteLine($"处理过程中出错: {ex.Message}"); } } }
关键细节说明
- 用
?.空值运算符避免NullReferenceException,比如当节点不存在时不会报错。 Trim()处理文本前后的空格,避免因为空格导致匹配失败。FirstOrDefault()找到第一个匹配的节点,如果没有匹配则返回null,方便后续判断。- 如果需要追加整个
<body>节点而不是单个元素,直接把bodyNode的子节点或者整个节点加进去就行,比如matchingItem.Add(bodyNode.Elements());
内容的提问来源于stack exchange,提问作者cfcorp
相关产品推荐
相关产品推荐

