XML - 如何在单个节点而不是整个文档中获取子节点?

时间:2012-10-26 05:45:33

标签: c# xml xmldocument xmlnode

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

这是我正在使用的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来获取书籍作者1,然后书籍B作者1,2,3,4,5

到目前为止,我正在使用的代码是循环通过所有作者所以我得到的书A作者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 + ", ";
       }
}

我读了一些如果我使用&#34; 。 &#34;之前&#34; //&#34;它会&#34;锚定#34;到当前节点,但它似乎没有工作,并在所有节点循环

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

3 个答案:

答案 0 :(得分:3)

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

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

应该是

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

答案 1 :(得分:1)

使用linq2XML..it很简单:

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
    }
}

答案 2 :(得分:0)

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

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

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

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

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

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

这当然是因为//会在任何地方查询,而./会相对查询。 很清楚的解释,但是很容易漏掉,找了好久才找到。

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