我遇到了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来污染我的表达式。所以我现在只需回答问题的第二部分。
答案 0 :(得分:4)
我更喜欢使用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");
答案 1 :(得分: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