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

本文关键字:命名空间 XDocument | 更新日期: 2023-09-27 18:34:27

这是我的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"); 

但它没有用。出了什么问题。谁能帮我?

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

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

展场空缺 http://data.usajobs.gov数据区 http://www.hr-xml.org/3显示 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();