4

我在使用 XPathNavigator 时遇到问题。我有一个文档,其中包含流中没有命名空间的一堆“主题”元素。

我正在使用(表达被简化到最低限度,首先我认为我的表达是错误的):

XPathDocument xmlDoc = new XPathDocument( stream );
XPathNavigator xml = xmlDoc.CreateNavigator();
XPathNodeIterator iter = xml.Select( "//topic" );

这行不通。我可以选择*/*/*或类似的东西并让我的“主题”元素正常。我尝试在在线测试器和其他语言中运行我的表达式并且它们有效。

问:怎么了?我一直怀疑它与被诅咒的 NamespaceManager 对象有关,每次我用命名空间解析文档时都会给我带来难以置信的痛苦,但是这次我正在寻找的元素没有明确的命名空间!我补充说:

XmlNamespaceManager s = new XmlNamespaceManager( xml.NameTable ); 

并将其作为第二个参数传递给 Select - 无济于事。我应该如何将“”命名空间添加到这个东西/正确使用它?

或者,更好的是,有没有办法在 .NET 中使用 XPath,而不像在其他语言中那样使用这种可怕的可憎的类?如果我想要命名空间,我可以将它们写在表达式中......

更新:我想出了一个解决方法——从根节点复制/粘贴默认 xmlns,然后使用该命名空间:

thisIsRetarded.AddNamespace( "x", "urn:xmind:xmap:xmlns:content:2.0" );
XPathNodeIterator projectIter = projectTree.Select( "//x:topic", thisIsRetarded );

但是,我不应该知道默认的 URI,也不喜欢用不必要的 x:-s 污染我的表达式。所以我现在只需要回答问题的第二部分。

4

2 回答 2

4

I prefer to use XmlDocument:

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("sample", "...");
doc.Load(stream);

XmlNode topic = doc.SelectSingleNode("/sample:topic", nsmgr);

// If you don't have any namespaces....
XmlNode topic2 = doc.SelectSingleNode("/topic"); 
于 2010-01-11T00:38:37.777 回答
0

通过默认命名空间和无命名空间之间的解释检查这个 StackOverflow 对同一问题的回答: Xml-SelectNodes with default-namespace via XmlNamespaceManager not working as expected

微软对如何使用默认命名空间的更好解释: https ://docs.microsoft.com/en-us/dotnet/standard/data/xml/xpath-queries-and-namespaces

于 2021-01-29T19:12:40.023 回答