解析 XML SOAP 响应 C#

Posted

技术标签:

【中文标题】解析 XML SOAP 响应 C#【英文标题】:Parsing XML SOAP Response C# 【发布时间】:2021-06-07 20:54:13 【问题描述】:

我一直在努力尝试使用 Linq(根本不是 Linq 的任何附件,它只是我发现的示例中最常用的)解析下面的 XML Soap 响应。我已经尝试了一些已经在 *** 上发布的类似答案,但它们都没有处理 XML 结构的不同元素上的这些多个命名空间。 SOAP 响应是一团糟,我知道,但它是给定的。我唯一需要的是 itemID 字段中的值(即 MyITItemName

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header
    xmlns:ns="http://services.mycompany.biz/it/managementservice/ITSMIT/1/"
    xmlns:ns1="http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/"/>
  <soapenv:Body
    xmlns:ns="http://services.mycompany.biz/it/managementservice/ITSMIT/1/"
    xmlns:ns1="http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/">
    <ns1:createItemResponse
      xmlns:ns1="http://services.mycompany.biz/it/managementservice/ITSMIT/1/">
      <ns2:id
        xmlns:ns2="http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/">338632
      </ns2:id>
      <ns2:itemID
        xmlns:ns2="http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/">MyITItemName
      </ns2:itemID>
    </ns1:createItemResponse>
  </soapenv:Body>
</soapenv:Envelope>

任何人都可以对此有所了解(或一些代码:-))吗?

【问题讨论】:

【参考方案1】:

因此,如果您知道您一直在寻找 ns2:itemID(MyITItemName 位于其中),您将需要访问子节点。我在下面有一个工作示例。我把你的 xml 文件保存为我的下载文件夹中的 xml 文件。

void Main()

    // replace this configFile location to where you save your xml file
    GetClientNoteXmlData("MyITItemName", @"C:\Users\first.last\Downloads\test.xml");


public void GetClientNoteXmlData(string client, string configFile)

    XmlDocument doc = new XmlDocument();
    doc.Load(configFile);

    XmlElement root = doc.DocumentElement;
    if (root != null)
    
        XmlNodeList list = root.GetElementsByTagName("ns2:itemID");
        foreach (XmlNode node in list)
        
            Console.WriteLine(node.InnerXml);
            Console.WriteLine(node.OuterXml);
        
    

【讨论】:

【参考方案2】:

您可以使用 Linq to XML 获取 itemId,尤其是 XDocument

string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">
  <soapenv:Header
    xmlns:ns=""http://services.mycompany.biz/it/managementservice/ITSMIT/1/""
    xmlns:ns1=""http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/""/>
  <soapenv:Body
    xmlns:ns=""http://services.mycompany.biz/it/managementservice/ITSMIT/1/""
    xmlns:ns1=""http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/"">
    <ns1:createItemResponse
      xmlns:ns1=""http://services.mycompany.biz/it/managementservice/ITSMIT/1/"">
      <ns2:id xmlns:ns2=""http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/"">338632</ns2:id>
      <ns2:itemID xmlns:ns2=""http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/"">MyITItemName</ns2:itemID>
   </ns1:createItemResponse>
  </soapenv:Body>
</soapenv:Envelope>";
XNamespace ns2 = "http://schemata.mycompany.biz/it/managementservice/ITSMIT/1/";

string itemId = XDocument.Parse(xml)
                .Descendants(ns2 + "itemID")
                .FirstOrDefault()
                .Value;

希望对您有所帮助。

【讨论】:

Nelson 的回答解决了我的问题,我接受了。但是您的回答确实非常酷,有见地且完整。非常感谢,@Sajid!

以上是关于解析 XML SOAP 响应 C#的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 和 XDocument/XElement 解析 Soap 响应

在PHP中解析XML SOAP响应

如何在php中解析soap xml响应并从字符串中获取信息

如何解析响应 xml 字符串?

使用Savon和Nokogiri在Rails中解析XML SOAP响应的内存不足

Worklight 6.1 并解析 MTOM soap 响应