2

我正在尝试解析一个重命名空间的 SOAP 消息(也可以在此处找到源):

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <ns1:TransactionID soapenv:mustUnderstand="1" xsi:type="xsd:string" xmlns:ns1="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">0a00f556419041c08d8479fbaad02a3c</ns1:TransactionID>
 </soapenv:Header>
 <soapenv:Body>
  <SubmitRsp xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">
   <MM7Version>5.3.0</MM7Version>
   <Status>
    <StatusCode xsi:type="ns2:responseStatusType_StatusCode" xmlns:ns2="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns="">1000</StatusCode>
    <StatusText xsi:type="ns3:statusTextType" xmlns:ns3="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns="">Success</StatusText>
   </Status>
   <MessageID>B08CF7B847DAD89C752334BDEBB69B5B</MessageID>
  </SubmitRsp>
 </soapenv:Body>
</soapenv:Envelope>

就上下文而言,这是MM7 提交消息的响应。

如何获得以下值:

TransactionID、StatusCode、StatusText、MessageID

当查询包含像“soapenv:Body”这样的值时,我尝试了 Linq-Xml,但没有运气。

4

3 回答 3

3

如果您尝试XName使用命名空间构建一个,则需要从一个XNamespace加号字符串构建它,例如

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
XName body = soapenv + "Body";

然后,当您将XNamebody”与 Linq-to-XML 一起使用时,它将匹配<soapenv:Body>文档中的元素。

您可以做类似的事情来允许使用命名空间构建其他元素的名称。

于 2009-08-12T11:07:25.043 回答
3

还有一种更简单的方法。您可以使用 {} 表示法简单地指定命名空间内联:

var soap = XElement.Load(soapPath);
var transactionID = 
        from e in soap.Descendants("{http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2}TransactionID")
        select e.Value;
于 2009-08-12T11:14:54.187 回答
0

我认为您将需要使用 XmlDocument(用于读取 XML)和 XmlNamespaceManager(用于检索命名空间数据)并使用来自这些对象的 XPath 查询。

于 2009-08-12T11:04:02.960 回答