我正在尝试从不是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 ......出了什么问题?
答案 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
下找到listitem
和varlistentry
元素。
这有效:
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)
//refentry/refsect1[@id='parameters']/variablelist
都会为您提供与前两个节点相关的所有variablelist
个节点。然而,这对你来说并不好,所以如果你需要任何性能,你应该始终开始导航你的根节点/