我有一个 xml 文件。我必须搜索一个属性并使用 c# 将其值替换为某个值此外,我不知道该属性出现了多少次以及动态生成该 xml 时有多少元素。对此有什么帮助吗?
问问题
3725 次
1 回答
3
一种方法是将文档加载到实例中,然后通过使用带有 XPath 表达式的实例的方法来System.Xml.XmlDocument
查找相应属性的所有出现并相应地修改它们。SelectNodes
XmlDocument
这是一个例子:
假设以下 XML 文档:
<?xml version="1.0"?>
<test>
<a/>
<b myAttribute="someValue"/>
<c myAttribute="someOtherValue"/>
<d/>
<e>
<f myAttribute="yetAnotherValue" anotherAttribute="anIrrelevantValue"/>
</e>
</test>
将 Xml 文档另存为test.xml
. 在同一目录下,编译以下程序。它将更改所有被调用的属性的值myAttribute
(由 XPath 表达式选择//@myAttribute
):
using System;
using System.Xml;
class Program
{
public static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Console.WriteLine("Before:");
Console.WriteLine(doc.OuterXml);
foreach (XmlNode node in doc.SelectNodes("//@myAttribute")) {
node.Value = "new value";
}
Console.WriteLine("After:");
Console.WriteLine(doc.OuterXml);
doc.Save("test.xml");
Console.ReadLine();
}
}
(为方便起见,还输出了修改前后的xml文档。)
使用命名空间
现在,该示例使用名称空间进行了扩展(根据 OP 的要求,XLink 之一):
xml文件:
<?xml version="1.0"?>
<test xmlns:xlink="http://www.w3.org/1999/xlink">
<a/>
<b xlink:myAttribute="someValue"/>
<c myAttribute="someOtherValue"/>
<d/>
<e>
<f xlink:myAttribute="yetAnotherValue" anotherAttribute="anIrrelevantValue"/>
</e>
</test>
C#代码:
using System;
using System.Xml;
class Program
{
public static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Console.WriteLine("Before:");
Console.WriteLine(doc.OuterXml);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
foreach (XmlNode node in doc.SelectNodes("//@xlink:myAttribute", nsMgr)) {
node.Value = "new value";
}
Console.WriteLine("After:");
Console.WriteLine(doc.OuterXml);
doc.Save("test.xml");
Console.ReadLine();
}
}
备注 1:注意myAttribute
现在只修改了两次调用的属性,第三次(在<c>
元素中)不属于 XPath 表达式中指示的名称空间。
备注 2:Xml 文件和 C# 代码中使用的命名空间前缀恰好是相同的(xlink
),但这不是必需的。例如,您可以xl
在 C# 代码中使用并获得相同的结果(仅显示更改的行):
nsMgr.AddNamespace("xl", "http://www.w3.org/1999/xlink");
foreach (XmlNode node in doc.SelectNodes("//@xl:myAttribute", nsMgr)) {
于 2012-06-06T11:46:18.383 回答