我在使用C#进行xpath查询时遇到了一些问题,但我之前从未使用过命名空间,但我一般都有这个想法。我首先构造xml文档并创建命名空间管理器。
XmlDocument doc = new XmlDocument();
doc.Load(metaDataStream);
nsmgr = new XmlNamespaceManager(doc.NameTable);
rootNode = doc.ChildNodes[1];
nsmgr.AddNamespace(string.Empty, rootNode.Attributes["xmlns"].Value);
nsmgr.AddNamespace("xsi", rootNode.Attributes["xmlns:xsi"].Value);
nsmgr.AddNamespace("xsd", rootNode.Attributes["xmlns:xsd"].Value);
然后在类中的另一个方法中,我尝试查询xml ....
XmlNodeList selectedNodes = rootNode.SelectNodes("//somenode", nsmgr);
并且所选节点列表总是提供从下面的xml文本中选择的零节点。有人可以指导我出错吗? (作为一个注释,实际的XML并不完全是这样,但出于隐私原因,我不允许公开它,所以我尽力模糊数据,同时保留相同的属性)
<?xml version="1.0"?>
<ext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uuid="urn:uuid:03565202-d53b-4f26-83a2-4d94964ed4be" xmlns="http://www.something.com/ext/2010/10/01">
<somenode someattribute="somevalue">
</somenode>
</ext>
答案 0 :(得分:3)
我认为问题在于您使用string.Empty
作为命名空间的别名。这有效:
nsmgr.AddNamespace("def", rootNode.Attributes["xmlns"].Value);
...
XmlNodeList selectedNodes = rootNode.SelectNodes("//def:somenode", nsmgr);
基本上只要你做给它一个别名,它就可以正常工作。
(我个人更喜欢LINQ to XML而不是使用XPath,如果你使用的是.NET 3.5或更高版本,但如果您更喜欢使用XPath,这将会有效。)
编辑:行为在MSDN中指定:http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.addnamespace.aspx作为“前缀”参数的注释: “如果XmlNamespaceManager将用于解析XML路径语言(XPath)表达式中的命名空间,则必须指定前缀。如果XPath表达式不包含前缀,假设名称空间统一资源标识符(URI)是空名称空间。“