3

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

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

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

我在一个名为pattern的变量中引用了该节点。我想要一个可迭代的节点集合,每个节点都由上面的 [block-of-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 的一些特殊技巧的一些基本了解,因为它们都不能始终如一地工作。

我究竟做错了什么?

4

6 回答 6

3

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

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

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

马克

于 2009-03-31T05:27:51.003 回答
2

你有没有尝试过:

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

或者

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

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

于 2009-03-31T00:36:24.073 回答
0

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

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

编辑:这是格式良好的 xml 吗?

于 2009-03-30T21:57:13.630 回答
0

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

于 2009-03-30T21:59:34.857 回答
0

我只是在搜索这个,发现只要输入:

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

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

于 2012-04-05T20:59:21.300 回答
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
于 2013-01-29T21:21:51.013 回答