我不确定为什么这不起作用。
我有一个已知格式的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的一些特殊技巧的一些基本理解,因为它们都没有一致地工作。
我做错了什么?
答案 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