XmlNode.SelectNodes的基础知识?

时间:2009-03-30 21:51:57

标签: c# xml xpath selectnodes

我不确定为什么这不起作用。

我有一个已知格式的XmlNode。它是:

<[setting-name]>
    <dictionary>
       <[block-of-xml-to-process]/>
       <[block-of-xml-to-process]/>
       <[block-of-xml-to-process]/>
    </dictionary>
</[setting-name]>

我在一个名为 pattern 的变量中引用了该节点。我想要一个可迭代的节点集合,每个节点都由上面的[xml-to-process]块表示。此时块的名称和结构是未知的。 [设置名称]已知。

这看起来非常简单。我可以想到应该指向块的六个XPATH表达式。我试过了:

XmlNodeList kvpsList = pattern.SelectNodes(String.Format(@"/{0}/dictionary/*", _CollectionName));
XmlNodeList kvpsList = pattern.SelectNodes(String.Format(@"{0}/dictionary/*", _CollectionName));
XmlNodeList kvpsList = pattern.SelectNodes(@"//dictionary/*");
XmlNodeList kvpsList = pattern.SelectNodes(@"//dictionary");

但是,我显然缺乏对XPATH或.SelectNodes的一些特殊技巧的一些基本理解,因为它们都没有一致地工作。

我做错了什么?

6 个答案:

答案 0 :(得分:3)

您是否尝试从XPath字符串中删除“@”??

XmlNodeList kvpsList = pattern.SelectNodes("//dictionary");

这应该有效 - 每天对我有用: - )

马克

答案 1 :(得分:2)

你试过了吗?

XmlNodeList kvpsList = pattern.SelectNodes(@"//dictionary:child");

OR

XmlNodeList kvpsList = pattern.SelectNodes(@"/[setting-name]/dictionary:child");

几乎得到了“词典”的孩子们 如果这不起作用,实际的字典调用是否有效?

答案 2 :(得分:0)

变量pattern有什么用? 它是对整个XML的DOM的引用吗?

看看这会导致什么 pattern.SelectNodes("//dictionary/").ChildNodes.Count

编辑:这是一个结构良好的xml吗?

答案 3 :(得分:0)

命名空间是否会导致问题?另外,尝试查看“pattern.OuterXml”以确保您正在查看正确的元素。

答案 4 :(得分:0)

我只是在搜索这个,发现如果你只输入:

就行了
XmlNodeList kvpsList = pattern.SelectNodes("dictionary");
然后,

kvpsList将包含所有[xml-to-process] -s,但我无法理解为什么。 =')

答案 5 :(得分:0)

我遇到了同样的问题,它似乎是一个已知但意外的行为。见Xml-SelectNodes with default-namespace via XmlNamespaceManager not working as expected

例如,我通过使用XmlDocument的NameTable实例化XmlNamespaceManager来使其工作,然后添加了一个具有任意名称的命名空间,例如与主文档元素的NamespaceURI相关联的“a”。请注意,在我的情况下,XmlDocument的NamespaceURI是空白的,但它的DocumentElement的NameSpaceURI实际上有一个值。这可能就是为什么在没有最初指定命名空间的情况下它将无法工作。

XmlDocument doc = new XmlDocument();
doc.Load( file.FullName );
XmlNode docElement = doc.DocumentElement as XmlNode;
XmlNamespaceManager nsman = new XmlNamespaceManager( doc.NameTable );
nsman.AddNamespace( "a", docElement.NamespaceURI );
docElement.SelectNodes( "a:wavetrack", nsman ); //docElement.SelectNodes("wavetrack") wasn't working