Я просто пытаюсь проанализировать ответ SOAP и извлечь ResponseCode и UnconfirmedReasonCode Элементы из следующего XML:
<?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()
Это наиболее часто задаваемые вопросы о выборе элементов 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" />