XPath:从非根节点中选择失败

时间:2011-09-01 21:19:36

标签: c# xml xpath

我正在尝试从不是XML文档的根节点的节点开始选择节点。代码如下:

 foreach (XmlNode xmlIter in root.SelectNodes("/refentry/refsect1[@id='parameters']/variablelist/*")) {
    Parameter p = new Parameter();

    xmlNode = xmlIter.SelectSingleNode("varlistentry/term/parameter");
    p.Identifier = xmlNode.InnerText;

    xmlNode = xmlIter.SelectSingleNode("varlistentry/listitem");
    p.Documentation = xmlNode.InnerText;
}

XML文档(这里只是一个片段)如下:

<refsect1 id="parameters"><title>Parameters</title>
    <variablelist>
    <varlistentry>
        <term><parameter>pipeline</parameter></term>
        <listitem>
        <para>

        </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term><parameter>program</parameter></term>
        <listitem>
        <para>

        </para>
        </listitem>
    </varlistentry>
    </variablelist>
</refsect1>

但是上面的代码不起作用: xmlNode 变量总是为null ......出了什么问题?

2 个答案:

答案 0 :(得分:3)

前导“/”表示“从文档的根目录开始”。试试吧:

xmlNode = xmlIter.SelectSingleNode("varlistentry/term/parameter");
p.Identifier = xmlNode.InnerText;

xmlNode = xmlIter.SelectSingleNode("varlistentry/term/listitem");
p.Documentation = xmlNode.InnerText;

(如果您使用的是.NET 3.5或更高版本,我个人会使用LINQ to XML - 我觉得它比XPath更容易使用,但这是另一回事。如果你能提供相同的LINQ to XML代码想。)

编辑:知道了。您的[stuff]/variablelist/*查询已经进入varlistentry节点 - 然后您尝试在下面找到另一个varlistentry节点。如果您选择所有varlistentry元素,则只需在term/parameter下找到listitemvarlistentry元素。

这有效:

foreach (XmlNode xmlIter in doc.SelectNodes
         ("/refentry/refsect1[@id='parameters']/variablelist/varlistentry"))
{
    XmlNode xmlNode = xmlIter.SelectSingleNode("term/parameter");
    Console.WriteLine("Identifier = {0}", xmlNode.InnerText);

    xmlNode = xmlIter.SelectSingleNode("listitem");
    Console.WriteLine("Documentation = {0}", xmlNode.InnerText);
}

请注意,使用它之前,xmlNode非空值可能仍然值得验证。

答案 1 :(得分:1)

无论在xml文件中的位置如何,

//refentry/refsect1[@id='parameters']/variablelist都会为您提供与前两个节点相关的所有variablelist个节点。然而,这对你来说并不好,所以如果你需要任何性能,你应该始终开始导航你的根节点/