从具有多个命名空间的 XElement 中获取元素

Posted

技术标签:

【中文标题】从具有多个命名空间的 XElement 中获取元素【英文标题】:Get element from XElement with multiple namespaces 【发布时间】:2021-10-19 07:38:03 【问题描述】:

我正在从 Web 服务响应接收 SOAP,但由于有多个命名空间,我不确定如何调用它。任何帮助表示赞赏。

回复如下:

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <getCompaniesResponse xmlns="http://mastercard.com/sd/pc/service" xmlns:ns2="http://mastercard.com/sd/pc2/service">
         <company>
            <id>123456</id>
            <name>Name is here</name>
            <issuerName>Issuer name is here</issuerName>
         </company>
         <errorMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
      </getCompaniesResponse>
   </S:Body>
</S:Envelope>

我试图从 SOAP 中获取公司元素。到目前为止,这是我尝试过的:

        var xe = XElement.Parse(response);
        XNamespace ns = "http://mastercard.com/sd/pc2/service";
        var obj = (string)xe.Descendants(ns + "company").Single();
        Console.WriteLine(obj);

在上面的代码中,我假设我只需要最后一个命名空间,但它返回 null。我还尝试了其他两个名称空间,结果相同。

【问题讨论】:

【参考方案1】:

指定第一个命名空间而不是 ns2

var xe = XElement.Parse(response);
XNamespace ns = "http://mastercard.com/sd/pc/service";
var obj = (string)xe.Descendants(ns + "company").Single();
Console.WriteLine(obj);

【讨论】:

以上是关于从具有多个命名空间的 XElement 中获取元素的主要内容,如果未能解决你的问题,请参考以下文章

C#用命名空间前缀编写XElement,但不包括根元素中的前缀

XElement 不应该从其父 Xelement 继承命名空间吗?

Linq to Xml:删除命名空间

在解析期间设置命名空间

从 XElement 获取子元素 [重复]

从 XElement 创建带有名称空间和模式的 XML