【问题标题】:Xml decendants for a Xml nodeXml 节点的 Xml 后代
【发布时间】:2018-05-18 01:02:51
【问题描述】:

这里是一个简化的mxl结构'xml',

<store>

<book_1>
   <author_1><name>Alice</name><age>30</age></author_1>
   <author_2><name>Bob</name><age>31</age></author_2>
<book_1>
   <author_1><name>Charley</name><age>29</age></author_1>
   <author_2><name>Dory</name><age>25</age></author_2> 
<book_1>    
</store>

这是我尝试过的;

 XmlDocument submission = new XmlDocument();
   submission.LoadXml(xml);
    var bookNodes = submission.SelectNodes("//*[starts-with(local-name(),'book_')]");

这给了我一个书单。

 foreach (XmlNode book in bookNodes)
  {
    //I want to do something like to find book authors for the book in context e.g. for the first book I just want nodes for Alice and Bob.
   // var bookAuthors = book.SelectNodes("decendants::[starts-with(local-name(),'author_')"); 

  }

我怎样才能开始检查后代元素?

编辑: 好像是笔误...

var bookAuthors = book.SelectNodes("descendant::*[starts-with(local-name(),'MeritCriterion_')]");

【问题讨论】:

  • 除了拼写错误(应该是descendant::)和缺少结束括号之外,您注释掉的内容似乎没有太大问题。
  • 他们还需要一个星号来检查所有后代节点。就目前而言,他们正在寻找没有后代节点的条目,这会导致像“System.Xml.XPath.XPathException: 'Expression must evaluate to a node-set.'”这样的错误
  • 傻了,谢谢你指出这一点。@MikeMcCaughan

标签: c# xml xpath


【解决方案1】:

您可以使用以下 XPath 语法访问您的后代节点:

XmlDocument submission = new XmlDocument();
submission.LoadXml(xml);

var bookNodes = submission.SelectNodes("//*[starts-with(local-name(),'book_')]");

foreach (XmlNode book in bookNodes)
{
    var author = book.SelectNodes("descendant::*[starts-with(local-name(),'author_')]");

    foreach (XmlNode authorInfo in author)
    {
        Console.WriteLine(authorInfo .InnerText);
    }
}

简而言之,您需要访问descendant::(all)[starts-with],否则您只是试图访问 XPath 中的任何后代。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多