Проблемы с выбором одного узла с помощью xPath - PullRequest
0 голосов
/ 10 октября 2011

Я просто пытаюсь проанализировать ответ 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()

1 Ответ

2 голосов
/ 11 октября 2011

Это наиболее часто задаваемые вопросы о выборе элементов 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" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...