Получить узел значения в XML с vbscript ASP - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь получить значение узла в ответе XML. Я новичок в ASP.

Вот XML:

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
   <soap:Body>
      <ns2:getTextoTsjResponse xmlns:ns2="http://x.com/x/act" xmlns:ns3="http://i.e.com" xmlns:ns4="http://comun.e.com">
         <return>
            <ns3:texto>
               <ns3:datos>
                  <xop:Include href="cid:888a-4ad6-a511-9c6f0490590e-398@entidad.com" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
               </ns3:datos>
               <ns3:extension>pdf</ns3:extension>
            </ns3:texto>
            <ns3:textoAnonimizado>
               <ns3:datos>
                  <xop:Include href="cid:888a-4ad6-a511-9c6f0490590e-399@entidad.com" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
               </ns3:datos>
               <ns3:extension>pdf</ns3:extension>
            </ns3:textoAnonimizado>
         </return>
      </ns2:getTextoTsjResponse>
   </soap:Body>
</soap:Envelope>

Мне удалось получить XMLDo c и выполнить синтаксический анализ. Что я пытаюсь сделать, так это получить значения href внутри node.

Вот код ASP.

'Response from server with the XML
xmlParseado = response.Text
Set xmlDoc = Server.CreateObject("MSXML2.DOMDocument")
xmlDoc.loadXML(xmlParseado) 

if xmlDoc.parseError.errorcode <> 0 then
  Response.Write("XML Error...<br>")
else

  Call xmlDoc.setProperty("SelectionLanguage", "XPath")
  Call xmlDoc.setProperty("SelectionNamespaces", "xmlns:ns3")

  Dim node 
 'Here im trying to get href value from <ns3:datos> node.

  Set node = xmlDoc.selectSingleNode("//ns3:texto//ns3:datos//*")

  If (node Is Nothing) Then  
    Response.write "nothing"
  Else

  response.write(TypeName(node) & "<br />")

  End If

end if

Некоторая помощь будет оценена.

Заранее спасибо

1 Ответ

1 голос
/ 30 мая 2020

Вы действительно близки.

К сожалению, ваш XML (как и многие плохо спроектированные XML документы) страдает от избыточного пространства имен. Если вы думаете о таких элементах, как файлы данных в файловой системе, эти XML дизайнеры параноиков считают, что два файла (элемента) будут иметь одно и то же имя, поэтому они помещают каждый файл (элемент) на отдельный диск, а не просто используют папки ( элементы вложенности) для контекста. За всю свою карьеру я ни разу не сталкивался с проблемой с двумя файлами с одинаковыми именами, но каждый день в Stackoverflow появляется сообщение от кого-то, у кого проблемы с пространствами имен.

диск в файловой системе. В документе для каждого «диска» указывается псевдоним (префикс, например, ns3), и местоположение (URI, например http://i.e.com). Теперь, когда вы запрашиваете XML с помощью XPath, вы должны сообщить синтаксическому анализатору обо всех пространствах имен (дисках), и вы указываете префикс перед каждым элементом на «диске». Ваш XPath будет выглядеть как «// ns3: datos», а не просто «//datos ».

Итак, вооруженные пространствами имен, они стали« решением »для всего. Когда был создан SOAP, дизайнеры сошли с ума от пространств имен, и в результате каждый поместил пространства имен во все. Разработчики SOAP, должно быть, были обеспокоены тем, что их имена элементов Header, Envelope и Body могут быть повторно использованы в данных сообщения SOAP. Вместо того, чтобы называть элементы «SOAP_Header», «SOAP_Envelope» и «SOAP_Body», которые все могли запомнить, они реализовали SOAP с XML пространствами имен на случай, если содержимое сообщения случайно также включило элемент с именем «Header», «Envelope» "или" Тело ".

Когда вы устанавливаете SelectionNamesSpaces, вам необходимо установить и префикс, и URI. В этом примере у меня есть все пространства имен в вашем документе.

Удачи в вашем проекте, и, пожалуйста, присоединяйтесь ко мне в уничтожении пространств имен, где это возможно:)

if xmlDoc.parseError.errorcode <> 0 then
    Response.Write("XML Error...<br>")
    ' NOTE: Avoid nesting else statements, just stop.
    Response.End
End If


Call xmlDoc.setProperty("SelectionLanguage", "XPath")

' NOTE: you're missing the URI here in your namespace http://i.e.com
' Call xmlDoc.setProperty("SelectionNamespaces", "xmlns:ns3")

' Add all of the namespaces, including the prefix and URI
Call xmlDoc.setProperty("SelectionNamespaces", "xmlns:xop='http://www.w3.org/2004/08/xop/include' xmlns:ns2='http://x.com/x/act' xmlns:ns3='http://i.e.com' xmlns:ns4='http://comun.e.com'")

'Here im trying to get href value from <ns3:datos> node.
Dim node 
Set node = xmlDoc.selectSingleNode("//ns3:texto//ns3:datos//xop:Include")
If (node Is Nothing) Then  
    Response.write "nothing"
Else
    Response.write( node.getAttribute( "href" ) )
End If

' Here's how to get all of the Includes
Dim ndList
set ndList = xmlDoc.selectNodes( "//xop:Include" )
for each ndInclude in ndList
    Response.write( ndInclude.getAttribute( "href" ) )
next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...