使用XmlDocument对soap信封进行xml解析

时间:2017-02-04 03:16:01

标签: c# xml soap

我开始使用XmlDocument在C#中解析XML。我跟随xml

<?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:Body>
        <ns1:getCustomersResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://DefaultNamespace">
            <getCustomersReturn soapenc:arrayType="soapenc:string[2]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                <getCustomersReturn xsi:type="soapenc:string"></getCustomersReturn>
                <getCustomersReturn xsi:type="soapenc:string">some data</getCustomersReturn>
                <getCustomersReturn xsi:type="soapenc:string">some more data</getCustomersReturn>
            </getCustomersReturn>
        </ns1:getCustomersResponse>
    </soapenv:Body>
</soapenv:Envelope>

我的代码:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(result);  //loading soap message as string
XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);

xmlNamespaceManager.AddNamespace("ns1", "http://DefaultNamespace"); 

XmlNodeList xmlNodeList = xmlDocument.SelectNodes("//ns1:getCustomersResponse/getCustomersReturn", xmlNamespaceManager);

string[] results = new string[xmlNodeList.Count];

var str = "";
var count = 0;
foreach (XmlNode xmlNode in xmlNodeList)
{
    str += xmlNode.InnerText;
}

Assert.IsNull(results, xmlNodeList.Count + ", " + count + ", " + str);

我想将getCustomersReturn的子节点(文本)检索为string[]

问题:

所有节点都被扁平化为单个字符串而不是数组。

xmlNodeList.Count为1而不是3

编辑:实施答案后的后续问题

CS1061  'XmlDocument' does not contain a definition for 'SelectNodes' and no extension method 'SelectNodes' accepting a first argument of type 'XmlDocument' could be found (are you missing a using directive or an assembly reference?)

2 个答案:

答案 0 :(得分:2)

您的代码中有一处更改。 替换行:

XmlNodeList xmlNodeList = xmlDocument.SelectNodes("//ns1:getCustomersResponse/getCustomersReturn", xmlNamespaceManager);

以下行

XmlNodeList xmlNodeList = xmlDocument.SelectNodes("//ns1:getCustomersResponse/getCustomersReturn/getCustomersReturn", xmlNamespaceManager);

使用以下代码,它将为您提供所需的输出

    XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.LoadXml(result);  //loading soap message as string
                XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);

                xmlNamespaceManager.AddNamespace("ns1", "http://DefaultNamespace");

                XmlNodeList xmlNodeList = xmlDocument.SelectNodes("//ns1:getCustomersResponse/getCustomersReturn/getCustomersReturn", xmlNamespaceManager);

                string[] results = new string[xmlNodeList.Count];

                var str = "";
                var count = 0;
                foreach (XmlNode xmlNode in xmlNodeList)
                {
                    str += xmlNode.InnerText;
                }

                Assert.IsNull(results, xmlNodeList.Count + ", " + count + ", " + str);

答案 1 :(得分:0)

只需使用XPath表达式,此代码很简单,但可以帮助您了解自己有什么问题。此链接可以帮助您了解XPathhttps://en.wikipedia.org/wiki/XPath

    var xml = new XmlDocument();
    xml.LoadXml(xmlstring);
    XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
    manager.AddNamespace("ns1", "http://DefaultNamespace");
    //select all nodes using XPath
    var search = xml.SelectNodes("//ns1:getCustomersResponse/getCustomersReturn//getCustomersReturn",manager);
    //saving XmlNodeList to List<string>
    var r = new List<string>();
    foreach (XmlNode item in search)
        r.Add(item.InnerText);
    string[] ary = r.ToArray(); //convert List<string> to string[]