Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Namespace в XML / 16 сообщений из 16, страница 1 из 1
22.03.2010, 19:08
    #36535456
Namespace в XML
Доброго времени суток, уважаемые коллеги!
такой 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
22.03.2010, 19:21
    #36535485
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Namespace в XML
Падает с ошибкой На какой строчке?

Jah loves you.
...
Рейтинг: 0 / 0
22.03.2010, 22:41
    #36535715
Namespace в XML
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
23.03.2010, 10:14
    #36536158
Core12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Namespace в XML
Самый простой вариант изменить 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
23.03.2010, 10:24
    #36536181
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Namespace в XML
Код: plaintext
selectSingleNode(".//aa:sub1")
Тынц .
...
Рейтинг: 0 / 0
23.03.2010, 11:02
    #36536284
Namespace в XML
Antonariy
Код: plaintext
selectSingleNode(".//aa:sub1")
Тынц .
Не получается
Код: plaintext
Automation error, неопознанная ошибка
Antonariy, скажите, у Вас Ваш код отрабатывает нормально?

p.s. За ссылку спасибо
...
Рейтинг: 0 / 0
23.03.2010, 11:04
    #36536293
Namespace в XML
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
23.03.2010, 11:41
    #36536412
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Namespace в XML
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
23.03.2010, 13:13
    #36536768
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Namespace в XML
любитель 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
23.03.2010, 19:17
    #36538048
Namespace в XML
Это сработало.
AntonariyПопробуйте точку убратьНе пробовал, поскольку предыдущее решение отработало. Но, если проверю, то сюда отпишу.

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

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


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