我开始使用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?)
答案 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
表达式,此代码很简单,但可以帮助您了解自己有什么问题。此链接可以帮助您了解XPath
:https://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[]