从XML文件中提取值

seg*_*ult 0 c# xml

我有一个XML文件,其格式如下,

<Mapping name="abc">
  <Attribute name="a1" value="a2" />
  <Attribute name="..." value="..." />
</Mapping>
Run Code Online (Sandbox Code Playgroud)

我想提取所有对的Attribute名称和值,其中Mapping名称是"abc"(它发生在文件的多个部分).我怎样才能做到这一点?

Dar*_*rov 5

一个的XDocument和XPath表达式似乎是一个非常简单的方法来实现这一目标:

using System;
using System.Xml.Linq;
using System.Xml.XPath;

class Program
{
    static void Main()
    {
        var doc = XDocument.Load("test.xml");
        var values = doc.XPathSelectElements("//Mapping[@name='abc']");
        foreach (var item in values)
        {
            foreach (var att in item.Elements("Attribute"))
            {
                var name = att.Attribute("name").Value;
                var value = att.Attribute("value").Value;
                Console.WriteLine("{0}: {1}", name, value);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者XmlReader,如果XML文档非常大并且不能适合内存:

using System;
using System.Xml;

class Program
{
    static void Main()
    {
        using (var reader = XmlReader.Create("test.xml"))
        {
            bool reading = false;
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "Mapping")
                {
                    var name = reader.GetAttribute("name");
                    reading = name == "abc";
                }

                if (reading && reader.NodeType == XmlNodeType.Element && reader.Name == "Attribute")
                {
                    var name = reader.GetAttribute("name");
                    var value = reader.GetAttribute("value");
                    Console.WriteLine("{0}: {1}", name, value);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)