1

我有一个 xml 文件。我必须搜索一个属性并使用 c# 将其值替换为某个值此外,我不知道该属性出现了多少次以及动态生成该 xml 时有多少元素。对此有什么帮助吗?

4

1 回答 1

3

一种方法是将文档加载到实例中,然后通过使用带有 XPath 表达式的实例的方法来System.Xml.XmlDocument查找相应属性的所有出现并相应地修改它们。SelectNodesXmlDocument

这是一个例子:

假设以下 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 回答