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

我一直在努力尝试使用 Linq(根本不是 Linq 的任何附件,它只是我发现的示例中最常用的)解析下面的 XML Soap 响应。我已经尝试了一些已经在 StackOverflow 上发布的类似答案,但它们都没有处理 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>

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

【问题讨论】:

    标签: c# xml soap


    【解决方案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!
      猜你喜欢
      • 2016-09-03
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2016-09-18
      • 1970-01-01
      相关资源
      最近更新 更多