解析肥皂消息

时间:2017-06-21 11:46:45

标签: c# xml web-services soap xml-parsing

我最近开始使用SOAP 现在我正在尝试用C#解析SOAP消息 消息如下:

<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <ns1:getBuildingsResponse xmlns:ns1="http://someserver.net/~username/lab/servis?ws=1">
    <return SOAP-ENC:arrayType="ns2:Map[2]" xsi:type="SOAP-ENC:Array" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
  <item xsi:type="ns2:Map">
    <item>
      <key xsi:type="xsd:string">id</key>
      <value xsi:type="xsd:string">1</value>
    </item>
    <item>
      <key xsi:type="xsd:string">code</key>
      <value xsi:type="xsd:string">345-GESG</value>
    </item>
    <item>
      <key xsi:type="xsd:string">name</key>
      <value xsi:type="xsd:string">Building 1</value>
    </item>
  </item>
  <item xsi:type="ns2:Map">
    <item>
      <key xsi:type="xsd:string">id</key>
      <value xsi:type="xsd:string">7590913</value>
    </item>
    <item>
      <key xsi:type="xsd:string">code</key>
      <value xsi:type="xsd:string">353-gr</value>
    </item>
    <item>
      <key xsi:type="xsd:string">name</key>
      <value xsi:type="xsd:string">Building 2</value>
    </item>
  </item>
</return>

我想提取键 id 代码名称的值。
我尝试过这样的事情:

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(client.Invoke("getBuildings").ToString());
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
nsmgr.AddNamespace("i", "item");
XmlNodeList xNodelst = xdoc.DocumentElement.SelectNodes("item", nsmgr);
Console.WriteLine(xNodelst.Count); 
foreach (XmlNode xn in xNodelst)
{
   Console.WriteLine(xn.Value);
}

问题是,我不知道如何使用没有命名空间的标签... 这行代码:

Console.WriteLine(xNodelst.Count); 

总是打印0,但我希望它打印2,因为我在数组中有2个元素(ns2:Map [2])。
意思是,我想循环遍历所有这些元素:

<item xsi:type="ns2:Map">

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

XmlDocument xdoc = new XmlDocument();
    xdoc.LoadXml(client.Invoke("getBuildings").ToString());    
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);    
    XmlNodeList nodes = xDoc.SelectNodes("//item[@xsi:type='ns2:Map']",nsmgr);
    var nodeCount=nodes.Count;

试试这个,这可能对你有帮助。