powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Namespace в XML
16 сообщений из 16, страница 1 из 1
Namespace в XML
    #36535456
Доброго времени суток, уважаемые коллеги!
такой xml<aa:test_root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aa="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema">
<aa:sub1>6546545465465465</aa:sub1>
<aa:sub2>6546545465465465</aa:sub2>
</aa:test_root>

Нужно получить значение тэга <aa:sub1>
Делаю так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Public Sub MakeXML()

Dim xml_tmplt As String
Dim xml_doc As New MSXML2.DOMDocument60
Dim xml_error As IXMLDOMParseError
Dim xml_node As IXMLDOMNode

xml_tmplt = "C:\test.XML"

    
xml_doc.async = False
xml_doc.Load xml_tmplt
    If (xml_doc.parseError.errorCode <>  0 ) Then
       Set xml_error = xml_doc.parseError
       MsgBox ("XML! " & xml_error.reason)
       Set xml_doc = Nothing
       Exit Sub
    Else
    End If
    
MsgBox (xml_doc.namespaces.namespaceURI( 1 ))
    
MsgBox (xml_doc.documentElement.baseName)
Set xml_node = xml_doc.documentElement.selectSingleNode("sub1")
MsgBox (xml_node.baseName)
       
       Set xml_doc = Nothing
End Sub
Падает с ошибкой "ссылка на необъявленный префикс пространства имен: "аа""
Как быть, подскажите плиз.

Причем мне желательно использовать selectSingleNode и selectNodes
...
Рейтинг: 0 / 0
Namespace в XML
    #36535485
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Падает с ошибкой На какой строчке?

Jah loves you.
...
Рейтинг: 0 / 0
Namespace в XML
    #36535715
AntonariyПадает с ошибкой На какой строчке?

Jah loves you.
на этой:
Код: plaintext
1.
MsgBox (xml_node.baseName)
Я извиняюсь, только сейчас увидел. Некорректно я пост составил.
В приведенном коде ошибка, конечно другая, хоть и в этом же месте (object variable or With block variable not set). проблема, как мне кажется в том, что элемента по такому запросу не находится и в переменной xml_node nothing

Если же я ставлю такую строку :
Код: plaintext
1.
Set xml_node = xml_doc.documentElement.selectSingleNode("aa:sub1")
то ошибка получается в точности, как в первом посте.

Подскажите плиз, как мне получить такой элемент
...
Рейтинг: 0 / 0
Namespace в XML
    #36536158
Core12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый простой вариант изменить xml до такого вида
Код: plaintext
1.
2.
3.
4.
<test_root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aa="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema">
<sub1> 6546545465465465 </sub1>
<sub2> 6546545465465465 </sub2>
</test_root>

И получать значение нужного вам sub1 или sub2 следующим кодом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Option Explicit

Private Sub Command1_Click()
Dim xml_tmplt As String
Dim xml_doc As New DOMDocument60
Dim xml_error As IXMLDOMParseError
Dim xml_node As IXMLDOMNodeList
Dim Xpath As String
Dim xml1 As IXMLDOMElement

xml_tmplt = "C:\WORK\Logs\test.XML"

Set xml_doc = New DOMDocument60
xml_doc.async = False
xml_doc.Load xml_tmplt
    If (xml_doc.parseError.errorCode <>  0 ) Then
       Set xml_error = xml_doc.parseError
       MsgBox ("XML! " & xml_error.reason)
       Set xml_doc = Nothing
       Exit Sub
    Else
    End If
    

MsgBox (xml_doc.namespaces.namespaceURI( 1 ))
    
MsgBox (xml_doc.documentElement.baseName)
'Set xml_node = New IXMLDOMParseError
Set xml_node = xml_doc.documentElement.selectNodes("//test_root//sub1")

For Each xml1 In xml_node
 Xpath = xml1.xml
 MsgBox Xpath
Next

Set xml_doc = Nothing

End Sub
...
Рейтинг: 0 / 0
Namespace в XML
    #36536181
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
selectSingleNode(".//aa:sub1")
Тынц .
...
Рейтинг: 0 / 0
Namespace в XML
    #36536284
Antonariy
Код: plaintext
selectSingleNode(".//aa:sub1")
Тынц .
Не получается
Код: plaintext
Automation error, неопознанная ошибка
Antonariy, скажите, у Вас Ваш код отрабатывает нормально?

p.s. За ссылку спасибо
...
Рейтинг: 0 / 0
Namespace в XML
    #36536293
Core12Самый простой вариант изменить xml до такого вида
Код: plaintext
1.
2.
3.
4.
<test_root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aa="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema">
<sub1> 6546545465465465 </sub1>
<sub2> 6546545465465465 </sub2>
</test_root>

Core12, спасибо, конечно, но хотелось бы поправить xml без удаления указаний пространств имен.
Если ничего лучше не придумаю, то придётся делать так. Без указания namespace то работает вроде.
...
Рейтинг: 0 / 0
Namespace в XML
    #36536412
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOW TO: Use the ms:type-namespace-uri XPath Extension Function When Programming the MSXML DOM
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim xmlschema As MSXML2.XMLSchemaCache40

Dim xmldom As MSXML2.DOMDocument40
Set xmldom = New MSXML2.DOMDocument40

xmldom.async = False
xmldom.setProperty "SelectionNamespaces", "xmlns:ms='urn:schemas-microsoft-com:xslt'"
xmldom.Load "<Path to Books.xml>"

Set nlist = xmldom.selectNodes("//*[ms:type-namespace-uri()='urn:books']")

Dim node As MSXML2.IXMLDOMNode
For Each node In nlist
  Debug.Print node.nodeName
Next


вот это вас должно интересовать, тут свой неймспейс вставите
Код: plaintext
xmldom.setProperty "SelectionNamespaces", "xmlns:ms='urn:schemas-microsoft-com:xslt'"
...
Рейтинг: 0 / 0
Namespace в XML
    #36536768
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любитель vbaAntonariy, скажите, у Вас Ваш код отрабатывает нормально?
Конкретно этот не проверял, но аналогичными выражениями у меня распарсивается вордовский xml.
Код: plaintext
1.
Set n = Node.selectSingleNode(".//w:t")
If Not n Is Nothing And Len(TagContents) >  0  Then n.text = TagContents
Попробуйте точку убрать.
авторAutomation error, неопознанная ошибкаИз-под VBA что ли работаете? Добавьте обработчик ошибок, где распечатывалось бы Err.Description, в половине таких случаев оно содержит более конкретное описание.
...
Рейтинг: 0 / 0
Namespace в XML
    #36538048
Это сработало.
AntonariyПопробуйте точку убратьНе пробовал, поскольку предыдущее решение отработало. Но, если проверю, то сюда отпишу.

Antonariy, Konst_One, Core12 - большое спасибо!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Namespace в XML
    #37729930
polosatyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не создавать новую тему, задам свой вопрос в этой.

а что делать, если в документе несколько пространств имен?
например, ns0, ns1, ns2, и т.д.


В таком случае, конструкция:

Код: vbnet
1.
2.
3.
4.
    clsXDoc.setProperty "SelectionLanguage", "XPath"
    clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns0='http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader'"
    clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns1='urn:ean.ucc:2'"
    clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns2='urn:ean.ucc:order:2'"



Перекрывается, и выпадает та же ошибка: префикс ns0 не объявлен. Учитывается только последний объявленный ns2. Как быть?
...
Рейтинг: 0 / 0
Namespace в XML
    #37729946
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns0='http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader' xmlns:ns1='urn:ean.ucc:2' xmlns:ns2='urn:ean.ucc:order:2'"




так попробуйте
...
Рейтинг: 0 / 0
Namespace в XML
    #37729990
polosatyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо!
Собирался уже сам решение написать.
Не совсем так - не через запятую, а через & " " & .. как это ни странно.
...
Рейтинг: 0 / 0
Namespace в XML
    #37730002
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так я и дал пример с пробелом, где вы там запятые нашли?
...
Рейтинг: 0 / 0
Namespace в XML
    #37730015
polosatyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, ох, извиняюсь, у меня уже глаза за сегодня замылились, никакого внимания.
Запятую после "SelectionNamespaces" на все остальные пробелы глаз распространил как-то... :-)
...
Рейтинг: 0 / 0
Namespace в XML
    #37730128
Фотография BelowZero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... а я бы тупо открыл open'ом файл, нашёл начало тега и считал строчку до конца тега... или так ща не принято?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Namespace в XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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