如何使用XPathSelectElement

时间:2016-01-30 13:24:29

标签: c# xml xpath xsd

我从xml文档中提取一个元素,但它正在返回null

<?xml version="1.0" encoding="utf-8"?>
<Test1 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-test"
   xmlns="https://www.google.com/partner/testt.xsd">

  <Test2>OK</Test2>
  <Test3>1439379003</Test3>
</Test1>

我尝试提取test2元素但返回null

var responseXdoc = XDocument.Parse(response);
var statusElement = responseXdoc.XPathSelectElement("/Test1/Test2");

结果statusElementnull,但我期待Ok

命名空间中的问题

xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://www.google.com/partner/testt.xsd (Its my guess)

1 个答案:

答案 0 :(得分:3)

您的XML具有默认命名空间,范​​围中的元素会隐式继承。要使用XPath引用命名空间中的元素,您需要使用命名空间前缀,您需要在XmlNamespaceManager之前注册:

var nsManager = new XmlNamespaceManager(new NameTable());

nsManager.AddNamespace("d", "https://www.insuranceleads.com/partner/PricePresentationResult.xsd");

var statusElement = responseXdoc.XPathSelectElement("/d:Test1/d:Test2", nsManager);

<强> dotnetfiddle demo

或者,您可以使用XNamespace和LINQ API执行相同的操作,例如:

XNamespace d = "https://www.insuranceleads.com/partner/PricePresentationResult.xsd";
var statusElement = responseXdoc.Element(d + "Test1").Element(d + "Test2");