powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Декларирование пространств имен при разборе xml
2 сообщений из 2, страница 1 из 1
Декларирование пространств имен при разборе xml
    #40084782
Alexei Gennadevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Пытаюсь вытащить из xml информацию через getElementsByTagName. Мне нужен тег "Body" из примера ниже.

Код: xml
1.
2.
3.
<?xml version="1.0" encoding="utf-8"?>
<anyType xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Body xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema">



Код следующий:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub xmlTest()

Dim xmlDoc As MSXML2.DOMDocument60
Dim xmlBody As MSXML2.IXMLDOMNode

Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.async = False
xmlDoc.validateOnParse = False
xmlDoc.Load ("C:\xml.xml")

Set xmlBody = xmlDoc.getElementsByTagName("Body").Item(0)
Debug.Print xmlBody Is Nothing

End Sub



Проблема в том, что в результате xmlBody Is Nothing получается True.

Я так понимаю, проблема заключается в том, что нужно в коде как-то задекларировать простронство имен, то ли для префикса xsi, указанный в теге <anyType>, то ли xs из тега <Body>, то ли еще что-то. Можете, пожалуйста, помочь, что именно и где надо добавить?
...
Рейтинг: 0 / 0
Декларирование пространств имен при разборе xml
    #40084832
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexei Gennadevich,

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms762212(v=vs.85)?redirectedfrom=MSDNThe getElementsByTagName method simulates the matching of the provided argument against the result of the tagName property of IXMLDOMElement. When executed, it does not recognize or support namespaces. Instead, you should use the selectNodes method, which is faster in some cases and can support more complex searches.

Метод getElementsByTagName имитирует сопоставление предоставленного аргумента с результатом свойства tagName IXMLDOMElement. При выполнении он не распознает и не поддерживает пространства имен. Вместо этого вам следует использовать метод selectNodes, который в некоторых случаях работает быстрее и может поддерживать более сложный поиск.
или selectSingleNode, если это заведомо одна нода
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub xmlTest1()
Const X = "<?xml version='1.0' encoding='utf-8'?><anyType xmlns='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" & _
        "<Body xmlns='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xs='http://www.w3.org/2001/XMLSchema'><a>1</a></Body></anyType>"

Dim xmlDoc As MSXML2.DOMDocument60
Dim xmlBody As MSXML2.IXMLDOMNode

Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.async = False
xmlDoc.validateOnParse = False

xmlDoc.setProperty "SelectionNamespaces", "xmlns:n1='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xs='http://www.w3.org/2001/XMLSchema'"

xmlDoc.loadXML (X)
'Set xmlBody = xmlDoc.getElementsByTagName("Body").Item(0)
Set xmlBody = xmlDoc.selectSingleNode("//n1:Body")
Debug.Print xmlBody Is Nothing
Debug.Print xmlBody.XML

End Sub
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Декларирование пространств имен при разборе xml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]