C#从复杂的XML中提取数据

时间:2018-01-18 10:28:58

标签: c# xml

我正在尝试提取字段时使用以下XML。

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header xmlns:work="http://bea.com/2004/06/soap/workarea/">
      <work:WorkContext xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
         <java class="java.beans.XMLDecoder">
            <string>weblogic.app.MerchantQueryWebService</string>
            <int>214</int>
            <string>weblogic.workarea.StringWorkContext</string>
            <string>2.0</string>
            <string/>
         </java>
      </work:WorkContext>
   </env:Header>
   <env:Body>
      <m:RequestTransactionByTimeIntervalDetailedResponse xmlns:m="http://www.zain.com/">
         <m:RequestTransactionByTimeIntervalDetailedResult>
            <java:Status xmlns:java="java:com.obopay.ws.merchantquery.zain">0</java:Status>
            <java:TotalTransactions xmlns:java="java:com.obopay.ws.merchantquery.zain">3</java:TotalTransactions>
            <java:TotalAmount xmlns:java="java:com.obopay.ws.merchantquery.zain">13</java:TotalAmount>
            <java:Transactions xmlns:java="java:com.obopay.ws.merchantquery.zain">[4736510#254780852341#2#0#55#2018-01-18 11:05:14.166#Name]</java:Transactions>
            <java:Message xmlns:java="java:com.obopay.ws.merchantquery.zain">Success</java:Message>
         </m:RequestTransactionByTimeIntervalDetailedResult>
      </m:RequestTransactionByTimeIntervalDetailedResponse>
   </env:Body>
</env:Envelope>

我希望从节点获取数据,但我遇到了困难。

以下是我的代码:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(ServiceResult);
string xpath ="m:RequestTransactionByTimeIntervalDetailedResponse/m:RequestTransactionByTimeIntervalDetailedResult/";
var nodes = xmlDoc.SelectNodes(xpath);
foreach (XmlNode childrenNode in nodes)
{
   HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//java:Transactions").Value);  
}

2 个答案:

答案 0 :(得分:1)

您的xpath是错误的 - SelectNodes语句的范围来自执行xpath的节点,在您的情况下是文档元素。提供所需节点的完整路径。

此外,您尚未定义m:命名空间前缀引用的命名空间 - 创建XmlNamespaceManager,在其上调用AddNamespace以提供每个相关的命名空间,并将其作为SelectNodes的论据。

答案 1 :(得分:0)

根据Tom W的指导,我使用了以下代码并且工作得很好:

using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream()))
                {
                    //reading stream  
                    var ServiceResult = rd.ReadToEnd();
                    XmlDocument xDoc = new XmlDocument();
                    xDoc.LoadXml(ServiceResult);
                    XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xDoc.NameTable);
                    xmlnsManager.AddNamespace("env", "http://schemas.xmlsoap.org/soap/envelope/");
                    xmlnsManager.AddNamespace("work", "http://bea.com/2004/06/soap/workarea/");
                    xmlnsManager.AddNamespace("m", "http://www.zain.com/");
                    xmlnsManager.AddNamespace("java", "java:com.obopay.ws.merchantquery.zain");
                    string transactions = xDoc.SelectSingleNode("env:Envelope/env:Body/m:RequestTransactionByTimeIntervalDetailedResponse/m:RequestTransactionByTimeIntervalDetailedResult/java:Transactions", xmlnsManager).ChildNodes[0].InnerText;
                }