如何使用C#更新xml文件

本文关键字:xml 文件 更新 何使用 | 更新日期: 2023-09-27 18:25:44

我需要通过读取另一个xml文件来更新xml文件。

例如:

Source.xml

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="package1" version="1.0.26.0"/>
  <package id="package3" version="1.0.12.0"/>
  <package id="package4" version="1.0.40.0"/>
  <package id="package12" version="1.0.38.0"/>
  <package id="package6" version="1.0.8.0"/>
</packages>

Target.xml

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="package1" version="1.0.2.0"/>
  <package id="package2" version="1.0.1.0"/>
  <package id="package3" version="1.0.4.0"/>
  <package id="package4" version="1.0.3.0"/>
</packages>

在上面的示例中,两个文件中都存在"package1"。因此,Target.xml中的"package1"版本必须使用Source.xml中的值进行更新。

我尝试了以下代码,但在执行过程中遇到异常(编译过程中没有错误):

未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace XMLUpdate
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("In Execute..");
            string SourceFile = args[0];
            string TargetFile = args[1];
            string SourcePackageId = null;
            string SourcePackageVersion = null;
            XmlDocument SourceXmlDoc = new XmlDocument();
            XmlDocument TargetXmlDoc = new XmlDocument();
            SourceXmlDoc.Load(SourceFile);
            TargetXmlDoc.Load(TargetFile);
            XmlElement SourceRootElement = SourceXmlDoc.DocumentElement;
            //XmlElement SourceElement = SourceRootElement["packages"];
            XmlNodeList SourcexnList = SourceXmlDoc.SelectNodes("/packages");
            foreach (XmlNode Sourcexn in SourcexnList)
            {
                Console.WriteLine("In source loop..");
                SourcePackageId = Sourcexn["id"].InnerText;
                SourcePackageVersion = Sourcexn["version"].InnerText;
                Console.WriteLine("In source loop SourcePackageId.." + SourcePackageId);
                XmlElement TargetRootElement = TargetXmlDoc.DocumentElement;
                XmlNodeList TargetxnList = TargetXmlDoc.SelectNodes("/packages");
                foreach (XmlNode Targetxn in TargetxnList)
                {
                    Console.WriteLine("In Target loop..");
                    string TargetPackageId = Targetxn["id"].InnerText;
                    //string TargetPackageVersion = Targetxn["version"].InnerText;
                    if (SourcePackageId.Equals(TargetPackageId))
                    {
                        Targetxn["version"].InnerText = SourcePackageVersion;
                    }
                }
            }
        }
    }
}

有什么帮助吗?

感谢

如何使用C#更新xml文件

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace XMLUpdate
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("In Execute..");
            string SourceFile = args[0];
            string TargetFile = args[1];
            string SourcePackageId = null;
            string SourcePackageVersion = null;
            XmlDocument SourceXmlDoc = new XmlDocument();
            XmlDocument TargetXmlDoc = new XmlDocument();
            SourceXmlDoc.Load(SourceFile);
            TargetXmlDoc.Load(TargetFile);
            XmlElement SourceRootElement = SourceXmlDoc.DocumentElement;
            //XmlElement SourceElement = SourceRootElement["packages"];
            XmlNodeList SourcexnList = SourceXmlDoc.SelectNodes("/packages");
            foreach (XmlNode Sourcexn in SourcexnList)
            {
                Console.WriteLine("In source loop..");
                foreach(XmlNode childS in Sourcexn.ChildNodes)
                {
                    SourcePackageId = childS.Attributes["id"].InnerText;
                    SourcePackageVersion = childS.Attributes["version"].InnerText;
                    Console.WriteLine("In source loop SourcePackageId.." + SourcePackageId);
                    XmlElement TargetRootElement = TargetXmlDoc.DocumentElement;
                    XmlNodeList TargetxnList = TargetXmlDoc.SelectNodes("/packages");
                    foreach (XmlNode Targetxn in TargetxnList)
                    {
                        Console.WriteLine("In Target loop..");
                        foreach (XmlNode childT in Targetxn.ChildNodes)
                        {
                            string TargetPackageId = childT.Attributes["id"].InnerText;
                            if (SourcePackageId.Equals(TargetPackageId))
                            {
                                childT.Attributes["version"].InnerText = SourcePackageVersion;
                            }
                        }
                    }
                }
            }
        }

    }
}

您需要检查xmlNode的ChildNodes内部。

这应该有效,只有includeSystem.Xml.LinqSystem.Linq

var source = XDocument.Load("Source.xml");
var sPackages = source.Descendants("package");
var target = XDocument.Load("Target.xml");
var tPackages = target.Descendants("package");
foreach (var sPackage in sPackages)
{
    var tPackage = tPackages.FirstOrDefault(x => x.Attribute("id").Value == sPackage.Attribute("id").Value);
    if (tPackage != null && tPackage.Attribute("version").Value != sPackage.Attribute("version").Value)
    {
        target.Descendants("package").Single(x => x.Attribute("id").Value == sPackage.Attribute("id").Value)
                                     .SetAttributeValue("version", sPackage.Attribute("version").Value);
    }
}
target.Save("Target.xml");

这将更新源文件中的每个目标文件的包版本号。您可以基于上述代码轻松添加更多功能。正如您所看到的,Linq-to-XML非常干净和简单。