You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:44:16