【问题标题】:XML - How to grab child nodes in single node and not whole document?XML - 如何在单个节点而不是整个文档中获取子节点?
【发布时间】:2012-10-16 09:27:04
【问题描述】:

一直在寻找答案,但找不到任何东西 - 我很新,所以也许我没有找到正确的关键词?

这是我正在使用的 XML 示例

<database>
<book>
<title>A</title>
<author>
  <name>1</name>
</author>
</book>
<book>
<title>B</title>
<author>
  <name>2</name>
</author>
<author>
  <name>3</name>
</author>
<author>
  <name>4</name>
</author>
<author>
  <name>5</name>
</author>
</book>
</database>

我正在尝试使用 C# XMLDocument 来获取 A 书作者 1,然后获取 B 书作者 1、2、3、4、5

到目前为止,我正在使用的代码正在遍历所有作者,所以我得到了书 A author 1、2、3、4、5

我目前的代码大致如下

XmlDocument doc = new XmlDocument();
doc.Load("myxmlfile");
XmlNode root = doc.SelectSingleNode("database");
XmlNodeList nodelist = root.SelectNodes("book");

foreach (XmlNode n in nodelist)
        {

XmlNodeList authors = root.SelectNodes(".//author");
book.authorstring = "";
foreach (XmlNode author in authors)
       {
       book.authorstring = book.authorstring+author.SelectSingleNode("name").InnerText + ", ";
       }
}

我读到了一些地方,如果我在“//”之前使用“.”,它将“锚定”到当前节点,但它似乎没有工作并且正在循环通过所有节点

我做错了什么或错过了什么?

【问题讨论】:

  • 你不是说n.SelectNodes()吗?

标签: c# xml xmldocument xmlnode


【解决方案1】:

如果我理解正确,你的错误就在这一行:

XmlNodeList authors = root.SelectNodes(".//author");

应该是

XmlNodeList authors = n.SelectNodes(".//author");

【讨论】:

  • 谢谢!我的眼睛呆滞了,这是这个小东西!
【解决方案2】:

对于未来的读者,我偶然发现了这篇文章,但我忘记在我的 xPath 中添加 .

即(这是powershell,但没关系),

这是错误的,返回从根节点找到的第一个节点:

$descriptionNode = $someNode.SelectSingleNode("//Description")

这是正确的,并将第一个节点作为节点的子节点返回:

$descriptionNode = $someNode.SelectSingleNode(".//Description")

这当然是因为// 会在任何地方查询,而./ 会相对查询。 解释得很清楚,但很容易错过,需要一些时间才能找到。

方便的备忘单: https://devhints.io/xpath

【讨论】:

    【解决方案3】:

    使用linq2XML..使用很简单

    XElement doc=XElement.Load("yourXML.xml");
    
    var lstBooks=doc.Descendants("book").Select(x=>
    new
    {
        name=x.Element("title").Value,
        authors=x.Elements("author").Select(y=>y.Element("name").Value)
    }
    );
    

    lstBooks 现在包含所有必需的数据

    您现在可以这样做了

    foreach(var book in lstBooks)
    {
    book.name;//Name of the book
        foreach(var author in book)
        {
            author;//name of the author
        }
    }
    

    【讨论】:

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