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

问题描述 投票:0回答:3

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

这是我正在使用的 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 作者 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 + ", ";
        }
    }

我读到了一些内容,如果我在“//”之前使用“.”,它将“锚定”到当前节点,但它似乎不起作用并且正在循环所有节点

我做错了什么或遗漏了什么?

c# xml xmldocument xmlnode
3个回答
7
投票

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

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

应该是

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

3
投票

对于未来的读者,我看到这篇文章,但我忘记在我的 xPath 中添加

.

即(这是 powershell,但这并不重要),

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

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

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

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

这当然是因为

//
会在任何地方查询,而
./
会相对查询。 解释得很清楚,但是很容易错过,而且花了一些时间才找到。

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


1
投票

使用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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.