如何在XML文件中多次找到特定属性?

时间:2015-01-20 22:45:56

标签: c# xml linq-to-xml

我有一个XML文档:

<Results>
  <ResultSet "nothing special" Description="More of nothing" type="system">
    <Results1>
      <time>
        <Body type="system" datatype="int"></Body>
        <att2 type="session" datatype="float"></att2>
      </Result>
      <Result>
        <ID type="system" datatype="int"></ID>
        <Stuff type="session" datatype="float"></Stuff>
      </Result>
      <Result>
        <att1 type="system" datatype="int"></att1>
        <att2 type="session" datatype="int"></att2>
      </Result>
    </Results1>
    <Results2>
      <time>
        <att1 type="session" datatype="int"></att1>
        <att2 type="system" datatype="float"></att2>
      </Result>
      <Result>
        <ID type="system" datatype="float"></ID>
      </Result>
    </Results2>
  </ResultSet>
</Results>

我想使用C#获取列表中文档中每个type = "session"的路径。目前,我有一个函数来获取路径XPath。但我完全不知道如何搜索所有XML,无论节点如何。

我正在使用LINQ to XML,.NET framework 3.5,这就是我现在所拥有的:

    List<string> pathList = new List<string>(); 
    IEnumerable<XElement> path =
        from element in doc.Elements(/*I don't know*/)
        where (string)element.Attribute("type") == "session"
        select element;

    foreach (XElement element in path)
    {
        pathList.Add(getPath(element));
    }

2 个答案:

答案 0 :(得分:2)

您的XML没有单一的XML属性。您拥有的只是包含文本内容的元素。

你的意思是:

<Results>
  <ResultSet "nothing special" Description="More of nothing" type="system">
    <Results1>
      <time>
        <Body type="system" datatype="int"></Body>
        <att2 type="session" datatype="float"></att2>
      </Result>
      <Result>
        <ID type="system" datatype="int"></ID>
        <Stuff type="session" datatype="float"></Stuff>
      </Result>
      <Result>
        <att1 type="system" datatype="int"></att1>
        <att2 type="session" datatype="int"></att2>
      </Result>
    </Results1>
    <Results2>
      <time>
        <att1 type="session" datatype="int"></att1>
        <att2 type="system" datatype="float"></att2>
      </Result>
      <Result>
        <ID type="system" datatype="float"></ID>
      </Result>
    </Results2>
  </ResultSet>
</Results>

...

答案 1 :(得分:1)

您可以使用doc.Descendants()获取所有后代元素:

IEnumerable<XElement> path =
    from element in doc.Descendants()
    where (string)element.Attribute("type") == "session"
    select element;