C# XmlNode.SelectNodes的基础知识?

C# XmlNode.SelectNodes的基础知识?,c#,xml,xpath,selectnodes,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]&

我不知道这为什么不起作用

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

<[setting-name]>
    <dictionary>
       <[block-of-xml-to-process]/>
       <[block-of-xml-to-process]/>
       <[block-of-xml-to-process]/>
    </dictionary>
</[setting-name]>
但是,我显然对XPATH缺乏一些基本的了解,或者对.SelectNodes缺乏一些特殊的技巧,因为它们没有一个能始终如一地工作


我做错了什么?

变量
模式的用途是什么
它是对整个XML的DOM的引用吗

看看结果如何
pattern.SelectNodes(“//dictionary/”).ChildNodes.Count


编辑:这是格式正确的xml吗?

名称空间可能会导致问题吗?此外,请尝试查看“pattern.OuterXml”以确保您看到的是正确的元素。

您是否尝试过:

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

几乎都是《字典》的孩子们
如果这不起作用,那么对字典的实际调用是否起作用?

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

XmlNodeList kvpsList = pattern.SelectNodes("//dictionary");
这应该行得通——对我来说每天都行:——


Marc

我正在搜索这个,发现如果你只需键入以下内容,它就可以工作:

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

kvpsList将包含所有[block of xml to process]-s,但我不明白为什么。=')

我遇到了同样的问题,这似乎是一个已知但意外的行为。看

例如,我使用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

没有定义名称空间。而且,我已经检查了外部XML,以确保我正在加载我认为正在加载的内容。那么,在模式中循环如何。ChildNodes[0]。ChildNodes?您还没有提供一些重要的必要信息:完整的XML文档,请不要泛化,;“模式”表示的节点是什么?可能它不是文档的顶部节点。最后,什么是集合名?你能给出一个固定值的例子吗(在调试器中停止!)。我的也不起作用。我有一个XmlNode对象,它的ChildNodes属性显然包含两个节点,都名为“wavetrack”。尽管如此,当我调用XmlNode的SelectNodes(“wavetrack”)方法时,得到的XmlNodeList包含零个元素。尽管我尝试了XPath的变体,包括“//wavetrack”,但仍然会出现这种情况。我不知道为什么它不起作用,因为它似乎应该是直接的。似乎是一种已知/意外的行为:通过将“//”改为“/”,看看哪个解决了我的问题。这对我不起作用。我有一个包含两个“wavetrack”节点的节点(它是Audacity项目文件)。然而,当我调用SelectNodes(“wavetrack”)时,它返回零个元素。似乎是一种已知/意外的行为:
XmlNodeList kvpsList = pattern.SelectNodes("dictionary");
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