【问题标题】:XDocument with multiple namespace in c#在 C# 中具有多个命名空间的 XDocument
【发布时间】:2014-12-16 12:52:26
【问题描述】:

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

但它没有用。什么地方出了错。谁能帮帮我?

【问题讨论】:

  • 嗨@abatishchev。我在我的代码中询问问题。我没有问如何使用多个namespae
  • 嗨,好的,我明白了,很抱歉。
  • 您的 xml 无效。请给您的问题一个更好的标题以避免进一步混淆。
  • @abatishchev。当然 。谢谢

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


【解决方案1】:

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

ShowPositionOpening 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();

【讨论】:

  • var count = (from service in x.Descendants(n + "ShowPositionOpening") select (string)service.Element(nn + "DataArea").Element(nnn + "Show").Attribute ("recordSetCount").Value).FirstOrDefault();我也这样做过。非常感谢
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多