从节点列表c#.net中获取节点列表

时间:2010-09-02 13:21:12

标签: c# .net xml xpath

以下代码为我提供了一个nodeList来迭代:

XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator();
XPathNodeIterator dossierNodes = thisNavigator.Select("changedthisname/dossiers/dossier");

我正在处理这个nodeList,我需要从这个列表中获取另一个节点列表。 我试图通过使用此代码来实现此目的:

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

我在while(dossierNodes.MoveNext())循环中使用此代码,并希望此节点列表填充所有“allinea”。但是我没有得到任何结果回到我的alineaNodes迭代器。

文档结构如下:

alt text

如何从当前档案节点获取alinea节点??

我进行了调试,结果出来了:

alt text

    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 个答案:

答案 0 :(得分:3)

正确的完整路径是

changedthisname/dossiers/dossier/alineas/alinea

因此,如果您首先选择changedthisname/dossiers/dossier,那么相对路径为:

alineas/alinea

答案 1 :(得分:2)

您已经在档案节点中,因此当您在XPath查询的开头添加'/'时,您说“来自父节点”,此时恰好已经是档案节点。将您的XPath查询更改为:

修改

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

“卷宗/ alineas / ALINEA”

这应该可以解决问题。

答案 2 :(得分:0)

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

不是试图通过使用xpath来获取alinea,我只需在我的节点导航器上使用SelectDescendants,就像这里:

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


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

答案 3 :(得分: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())
            {

            }
        }

答案 4 :(得分:-1)

Linq to XML非常适合这个实例。

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

返回包含alldata.xml中所有元素的IEnumerable。希望这可以帮助。真的看看Linq这些东西很棒。