如何解析XML文件以有效地获取特定数据

时间:2010-03-09 09:57:38

标签: c# xml

我有一个XML文件,如下所示:

<?xml version="1.0" encoding="utf-8" ?> 
 <PathMasks>
 <Mask desc="Masks_X1">
  <config id="01" mask="88" /> 
  <config id="03" mask="80" /> 
  <config id="51" mask="85" /> 
  </Mask>

 <Mask desc="Masks_X2">
  <config id="70" mask="1" /> 
  <config id="73" mask="6" /> 
  </Mask>

 <Types>
  <path id="01" desc="TC->PP1" /> 
  <path id="02" desc="TC->PP2" /> 
  <path id="03" desc="TC->PPn" /> 
  </Types>
  </PathMasks>

如何解析文件并获取 Mask_X1 的所有数据如下:

id  value
=====
01, 88
03, 80
51, 85

我使用的.NET框架是2.0

4 个答案:

答案 0 :(得分:2)

当您使用.Net 2.0时,您将不会使用Linq,因此需要使用XPath,此示例应该可以帮助您。

        XmlDocument doc = new XmlDocument();

        doc.Load(pathToXmlDoc);


        XmlNode node = doc.SelectSingleNode("/PathMasks/Mask[@desc='Masks_X1']");

        foreach (XmlNode config in node)
        {
            Console.WriteLine("{0}\t{1}", 
                            config.Attributes["id"].Value,
                            config.Attributes["mask"].Value);
        }

答案 1 :(得分:1)

使用XmlDocument(更慢,更大的内存占用,读/写,与所有XML DOM在各处工作的方式相同):

XmlDocument d = new XmlDocument();
d.Load(filename);
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config"
foreach (XmlElement elm in d.SelectNodes(xpath))
{
   Console.WriteLine(elm.GetAttribute("id"), elm.GetAttribute("desc"));
}

使用XPathDocument(更快,更小的内存占用,只读,奇怪的API):

XPathDocument d = new XPathDocument(filename);
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config"
XPathNodeIterator iter = d.CreateNavigator().Select(xpath);
while (iter.MoveNext())
{
   Console.WriteLine(iter.Current.GetAttribute("id"), iter.Current.GetAttribute("desc'));
}

我确信有一个很好的理由可以解释为什么没有XPathNavigator的方法返回IEnumerable<XPathNavigator>,以便您可以像普通人一样迭代XP​​ath查询的结果,但我无法解决这个问题。

答案 2 :(得分:0)

使用XDocument并使用Linq to XML查询

XDocument doc = XDocument.Load("file.xml");
var linqtoxml = from node in document.Descendants("Mask")
    where (string)node.Attribute("desc").Value == "Masks_X1"
    select node;
foreach (var mask in linqtoxml)
{
    // pull data out of here into a structure of your choosing
}

答案 3 :(得分:0)

使用Linq to XML:

XDocument doc = XDocument.Load(filename);
var query = from mask in doc.Root.Elements("Mask")
            where mask.Attribute("desc").Value == "Masks_X1"
            from config in mask.Elements("config")
            select new
            {
                id = config.Attribute("id").Value,
                value = config.Attribute("mask").Value
            };

foreach(var mask in query)
{
    Console.WriteLine("{0}\t{1}", mask.id, mask.value);
}