2011-10-10 101 views
0

我只是试图解析SOAP响应并拉出ResponseCodeUnconfirmedReasonCode元素了以下XML的单个节点:麻烦选择使用XPath

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <CoverageResponse xmlns="http://www.iicmva.com/CoverageVerification/"> 
     <Detail> 
     <PolicyInformation> 
      <CoverageStatus> 
      <ResponseDetails> 
       <ResponseCode>CONFIRMED</ResponseCode> 
       <UnconfirmedReasonCode/> 
      </ResponseDetails> 
      </CoverageStatus> 
     </PolicyInformation> 
     </Detail> 
    </CoverageResponse> 
    </soap:Body> 
</soap:Envelope> 

我一直试图做的是不工作:

Dim doc As New XmlDocument 
doc.LoadXml(result) 

Dim root = doc.DocumentElement.FirstChild.FirstChild 
Dim responseDetails = root.SelectSingleNode("descendant::Detail/PolicyInformation/CoverageStatus/ResponseDetails") 
Dim responseCode = responseDetails.ChildNodes(0).InnerText 
Dim unconfirmedReasonCode = responseDetails.ChildNodes(1).InnerText 

Console.WriteLine("Response Details:" & vbCrLf & vbCrLf & responseCode & " " & unconfirmedReasonCode) 
Console.ReadLine() 

回答

2

这是关于选择与默认命名空间 XML文档的内容,其中最常见问题 - 请海用于XPath和默认命名空间。 提示:阅读有关XmlNamespaceManager类。

一个相对简单的和选择的更少可读方法:

使用:

/*/*/*/*/*/*/*/*[local-name()='ResponseCode'] 

和使用:

/*/*/*/*/*/*/*/*[local-name()='UnconfirmedReasonCode'] 

XSLT - 基于验证

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/*/*/*/*/*/*/*[local-name()='ResponseCode']"/> 
    <xsl:copy-of select= 
    "/*/*/*/*/*/*/*/*[local-name()='UnconfirmedReasonCode']"/> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档施加:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <CoverageResponse xmlns="http://www.iicmva.com/CoverageVerification/"> 
     <Detail> 
     <PolicyInformation> 
      <CoverageStatus> 
      <ResponseDetails> 
       <ResponseCode>CONFIRMED</ResponseCode> 
       <UnconfirmedReasonCode/> 
      </ResponseDetails> 
      </CoverageStatus> 
     </PolicyInformation> 
     </Detail> 
    </CoverageResponse> 
    </soap:Body> 
</soap:Envelope> 

两个正确地选择节点是输出:

<ResponseCode xmlns="http://www.iicmva.com/CoverageVerification/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">CONFIRMED</ResponseCode> 
<UnconfirmedReasonCode xmlns="http://www.iicmva.com/CoverageVerification/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 
+0

感谢一束! –

+0

@Scott:不客气。 –