从一个 nodelist 中获取另一个 nodelist(C# .NET)

3
以下代码给我一个节点列表进行迭代:
XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator();
XPathNodeIterator dossierNodes = thisNavigator.Select("changedthisname/dossiers/dossier");

我正在处理这个节点列表,我需要从中获取另一个节点列表。我尝试使用以下代码来实现:

XPathNavigator alineanodesNavigator = dossierNodes.Current;
XPathNodeIterator alineaNodes = alineanodesNavigator.Select("/dossier/alineas/alinea");

我正在while(dossierNodes.MoveNext())循环内使用此代码,并希望将此nodelist填充为所有“allinea”。 但是,我没有任何结果返回到我的alineaNodes迭代器。 文档结构如下: 如何从当前卷宗节点获取alinea节点?? 我进行了调试,并出现了以下情况:
    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
    string xml = reader.ReadToEnd();
    XmlDocument thisXmlDoc = new XmlDocument();
    thisXmlDoc.LoadXml(xml);

    XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator();
5个回答

3
正确的完整路径是:
changedthisname/dossiers/dossier/alineas/alinea

所以,如果你首先选择changedthisname/dossiers/dossier,那么相对路径就是:
alineas/alinea

是的,我真的尝试过了,但它根本不起作用。我甚至已经调试了所有这些内容,但我不知道为什么这不起作用。不过,我已经解决了这个问题:)。谢谢你的帮助。 - Younes
答案在我看来也是正确的,但不知为何我无法使用这个表达式获取列表 ;). 无论如何,你是对的,我已经尝试过了。你得到了积分。 - Younes

2
您已经在档案袋节点中,因此当您在XPath查询开头放入'/'时,您是在说"从父节点开始",而此时父节点已经是档案袋节点。请将您的XPath查询更改为:

编辑:

看到您的输出后,我意识到我的错误。您应该只是删除原始查询中的前导斜杠。

"dossier / alineas / alinea"

那应该就可以了。


我不知道为什么,但这并没有起作用。它说没有返回任何结果。 - Younes

0

好的,我已经解决了这个问题。

我不使用xpath来获取alinea,而是直接在我的节点浏览器上使用SelectDescendants方法,就像这样:

            XPathNavigator alineanodesNavigator = dossierNodes.Current;
            XPathNodeIterator alineaNodes = alineanodesNavigator.SelectDescendants("alinea", "", false);


            List<Alinea> thisAlineaList = new List<Alinea>();

0
在您最后一次调用 Select() 时,请使用以下 XPath 表达式:"//alinea"
以下代码片段迭代 alineas:
        XPathNavigator thisNavigator = doc.CreateNavigator();
        XPathNodeIterator dossierNodes = thisNavigator.Select("//dossier");
        while (dossierNodes.MoveNext())
        {
            XPathNavigator alineanodesNavigator = dossierNodes.Current;
            XPathNodeIterator alineaNodes = alineanodesNavigator.Select("//alinea");

            while (alineaNodes.MoveNext())
            {

            }
        }

-1

Linq to XML非常适合这种情况。

var alineaNodes = from alinea in XDocument.Load(alldata.xml).Descendents("alinea")
                  select alinea;

返回一个IEnumerable,其中包含alldata.xml中的所有元素。希望这可以帮到你。真的要深入研究Linq,它非常适合处理这些事情。


我不需要包含所有alineaNodes的列表,因为我正在迭代处理当前项。我需要将这些alineas添加到我的当前工作列表中。 - Younes
你可以将XDocument.Load(alldata.xml)更改为任何列表、XML文档或数据库。然后,您可以调整部分Descendents("aliena")以使用列表中所需的任何方法,以便查看其中包含的单个元素。在这种情况下,Linq确实具有所有您需要的功能。您还可以向其添加条件语句(例如,在select之前添加where语句)。 - Christopher B. Adkins
好的,谢谢,我会快速尝试一下。如果它有效,你就能得到积分 ;)。 - Younes
我把它放在了我的帖子底部。(请问如何编辑我的代码使其像你的一样工作) - Younes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接