Вы действительно близки.
К сожалению, ваш 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