选择包含几乎相同id的内部XML节点

时间:2016-12-01 14:38:12

标签: c# xml xpath linq-to-xml

这是我的XML ..

<rootparent>
  <root>
    ...other nodes here.
    ...
    <parent>
      <child id="child_1">
        .some other nodes ..
      </child>  
      <child id="child_2">
        .some other nodes ..
      </child>  
      ...other nodes
    </parent>
  </root>
</rootparent>

我需要select all the child nodes where id like 'child_%'使用LINQ to XML。

我得到了这个

的xpath
string xPath="/root/parent/child[id='child_*']";
var x1 =xml.XPathSelectElement(xPath);
var x2 = _sourceDoc.Root.XPathEvaluate(xPath); 

但它会返回Enumeration yielded no results

2 个答案:

答案 0 :(得分:1)

使用xml linq:

string xml =
    "<rootparent>" +
        "<root>" +
         "<parent>" +
          "<child id=\"child_1\">" +
          "</child>" +
          "<child id=\"child_2\">" +
          "</child>" +
         "</parent" +
        "</root>" +
    "</rootparent>";

XDocument doc = XDocument.Parse(xml);

List<XElement> children = doc.Descendants("child")
    .Where(x => ((string)x.Attribute("id")).StartsWith("child_"))
    .ToList();

答案 1 :(得分:0)

对于初学者,您的xpath与XML的结构不匹配。您的查询假设根被称为root但是有一个rootparent并且您没有考虑它。由于您只是在寻找child个节点,因此您甚至不需要引用它,只需查看后代即可。

您需要使用适当的条件。你的孩子都没有包含一个名为child_*的id元素,所以很自然你不会得到任何结果。使用starts-with功能并访问id 属性

//child[starts-with(@id, 'child_')]