如何使用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;
}
}
}
}
}
}
有什么帮助吗?
感谢
尝试以下操作:
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内部。
这应该有效,只有include
、System.Xml.Linq
和System.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非常干净和简单。