如何在C#中添加命名空间到XPath?

时间:2013-12-23 15:58:38

标签: c# xml xpath namespaces

我尝试解析XML文件:http://www.ikea.com/pl/pl/catalog/products/30198858?type=xml&dataset=normal,parentCategories,allImages但我收到了错误

  

需要命名空间管理器或XlstContext。此查询具有前缀,变量或用户定义函数。“

代码:

XPathDocument oXPathDocument = new XPathDocument(path);
XPathNavigator oXPathNameNavigator = oXPathDocument.CreateNavigator();
XPathNodeIterator oProductNodesIterator = oXPathNameNavigator.Select(@"/ikea-rest/products/product/items/item");
productModel.productName = oXPathNameNavigator.SelectSingleNode("name").Value;

我发现这个错误是由于缺少命名空间引起的,所以我试着像这样添加它:

XmlNamespaceManager nameSpace = new XmlNamespaceManager(oXPathNameNavigator.NameTable);
nameSpace.AddNamespace("ir",path);

现在我遇到了新的错误:“System.NullReferenceException:对象引用未设置为对象的实例。”在线:

productModel.productName = oXPathNameNavigator.SelectSingleNode("name").Value;

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

命名空间处理总是让我兴奋,所以我不得不四处游玩以使其正常工作。您最大的问题是,当您添加命名空间时,您需要提供该命名空间的地址,而不是重用xml doc本身的路径。

XPathDocument oXPathDocument = new XPathDocument(path);
XPathNavigator oXPathNameNavigator = oXPathDocument.CreateNavigator();
XmlNamespaceManager nameSpace = new XmlNamespaceManager(oXPathNameNavigator.NameTable);
//use the namespace address provided in the XML, not the path to the xml itself
nameSpace.AddNamespace("ir","http://www.ikea.com/v1.0");

//now you have to scope your query to the namespace you just defined, otherwise xpath will assume the node is not in a namespace
productModel.productName = oXPathNameNavigator.SelectSingleNode("//ir:ikea-rest/products/product/name", nameSpace).Value;

我在LinqPAD中对此进行了测试,并且能够正确地获取您感兴趣的节点。