Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解析XML文件以有效地获取特定数据_C#_Xml - Fatal编程技术网

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

C# 如何解析XML文件以有效地获取特定数据,c#,xml,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> <Ma

我有一个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>

我使用的.NET框架是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
}
使用Linq到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);
}

当您使用.NET2.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);
        }

使用
XmlDocument
(更慢、更大的内存占用、读/写,其工作方式与XMLDOMS的工作方式相同):

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


我确信没有一个
XPathNavigator
方法返回一个
IEnumerable
,这样你就可以像普通人一样迭代XPath查询的结果了,但是我还没有解决这个问题。

我使用的是.NET 2.0,似乎System.Xml名称空间中没有linq。在这种情况下,您几乎只能使用XmlDocument和XPath查询。
XPathDocument
早于
IEnumerable
。您可以编写自己的扩展方法来实现这一点,然后发布到这里。总有一天,我会记得这些技术是按照它们被引入的顺序引入的,而不是按照我了解到它们存在的顺序引入的。
SelectSingleNode
返回单个节点或null。您不能对结果进行迭代。使用SelectSingleNode确实会返回单个XmlNode。但是,每个XmlNode都包含一个子节点的集合,本例中的foreach在选定的单个掩码节点下迭代每个子节点。因此,在本例中,SelectSingleNode将选择具有保存值Mask_X1的desc属性的掩码节点。返回的XmlNode的ChildNodes属性将包含三个条目,分别对应于掩码节点下的每个配置节点。我们可以迭代子节点并生成所需的输出。
        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);
        }
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 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'));
}