我有一个XML文件,其格式如下,
<Mapping name="abc">
<Attribute name="a1" value="a2" />
<Attribute name="..." value="..." />
</Mapping>
我想提取Attribute
名称为Mapping
的所有"abc"
名称和值对(它出现在文件的多个部分中)。我怎么能这样做?
答案 0 :(得分: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);
}
}
}
}
或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);
}
}
}
}
}
答案 1 :(得分:1)
您可以使用LINQ to XML。
var items = from item in purchaseOrder.Descendants("Mapping")
where (string) item.Attribute("name") == "abc"
select new
{
Name = (string) item.Element("name"),
Value = (string) item.Element("value")
};