在c#中具有多个命名空间的XDocument

时间:2014-12-16 04:35:59

标签: c# xml linq-to-xml xml-namespaces

这是我的xml。我在C#中使用XDocument。我想得到" recordSetCount"。

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ShowPositionOpening xmlns="http://data.usajobs.gov">
      <ApplicationArea xmlns="http://www.openapplications.org/oagis/9">
        <CreationDateTime>2014-12-11T04:05:41</CreationDateTime>
      </ApplicationArea>
      <DataArea xmlns="http://www.hr-xml.org/3">
        <Show recordSetCount="6" recordSetTotal="6" recordSetCompleteIndicator="false" recordSetReferenceId="1" xmlns="http://www.openapplications.org/oagis/9">
          <OriginalApplicationArea>
            <CreationDateTime>2014-12-11T04:05:41</CreationDateTime>
          </OriginalApplicationArea>
        </Show>

我试过以下

var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");

var jobCount = x.XPathSelectElement("/s:Envelope/s:Body/ShowPositionOpening/DataArea/Show/@recordSetCount", namespaceManager).Value;

但它有效。也尝试如下

XNamespace xmlns = "http://www.openapplications.org/oagis/9";
XNamespace xmlns1 = "http://data.usajobs.gov";
XNamespace x1 = "http://www.hr-xml.org/3";

var jobCount = x.Element("ShowPositionOpening")
                .Element(xmlns1 + "DataArea")
                .Element(x1 + "Show")
                .Attribute("recordSetTotal"); 

但它没有用。什么地方出了错。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

您的数据有多个名称空间,其中每个子项位于不同的名称空间中,您需要相应地调整查询。

ShowPositionOpening    http://data.usajobs.gov
DataArea               http://www.hr-xml.org/3
Show                   http://www.openapplications.org/oagis/9
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
namespaceManager.AddNamespace("X", "http://data.usajobs.gov");
namespaceManager.AddNamespace("XX", "http://www.hr-xml.org/3");
namespaceManager.AddNamespace("XXX", "http://www.openapplications.org/oagis/9");
// you'll need to change this to XPathEvaluate
// since you're not evaluating to an element
var JobCount = x.XPathEvaluate("/s:Envelope/s:Body/X:ShowPositionOpening/XX:DataArea/XXX:Show/@recordSetCount", namespaceManager);

或使用linq:

XNamespace n = "http://data.usajobs.gov";
XNamespace nn = "http://www.hr-xml.org/3";
XNamespace nnn = "http://www.openapplications.org/oagis/9";
var JobCount = x.Descendants(n + "ShowPositionOpening")
                .Elements(nn + "DataArea")
                .Elements(nnn + "Show")
                .Attributes("recordSetCount")
                .SingleOrDefault();