powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
11 сообщений из 11, страница 1 из 1
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39151906
anvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток
Пытаюсь разобрать xml данные листа Excel и почему-то не работает MSXML2.DOMDocument60
Код: vbnet
1.
2.
3.
4.
5.
6.
Public Sub test()
    Dim pDoc As New MSXML2.DOMDocument60, pSel As MSXML2.IXMLDOMSelection
    pDoc.Load "d:\path\sheet5.xml"
    Set pSel = pDoc.SelectNodes("/worksheet/sheetData/row")
    Stop
End Sub


Если использовать MSXML2.DOMDocument или MSXML2.DOMDocument30, то узлы row отбираются, а если MSXML2.DOMDocument40 или MSXML2.DOMDocument60, то нет. Что нужно тогда указывать в строке запроса?
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39151910
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что в MS парсер к версии MSXML2.DOMDocument40 наконец-то привели к стандартам, которые, в частности, требуют указания в XPath префикса неймспейса, если таковой наличествует (а в данном случае он наличествует). Если неймспейс задан без префикса, то префикс назначаем сами. Неймспейсы для XPath задаются методом setProperty для свойства SelectionNamespaces . Выглядит это примерно так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
var dom = new ActiveXObject("MSXML2.DOMDocument.6.0");
dom.async= false;
dom.validateOnParse = false;
dom.load("sheet5.xml");
dom.setProperty("SelectionNamespaces", "xmlns:main='http://schemas.openxmlformats.org/spreadsheetml/2006/main'");
var nodes = dom.selectNodes("/main:worksheet/main:sheetData/main:row");
WScript.Echo(nodes.length); // выводит 20
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39152102
anvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны , большое спасибо. Использовал ваше решение - заработало.
Тогда, если можно, ещё вопрос. Я удалил данные о пространствах имён
Код: xml
1.
xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"

, то есть корневой узел стал просто <worksheet> и использовал XPath запрос "/worksheet/sheetData/row", но MSXML2.DOMDocument60 возвращает пустую коллекцию узлов. Хотя на других xml-файлов, например таком
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="utf-8"?>
<table date="2016-01-09" name="mytable1">
  <row num="5">
    <id>112</id>
    <name>english name 1</name>
    <date>2014-10-31</date>
  </row>
  <row num="6">
    <id>132</id>
    <name>english name 2</name>
    <date>2015-01-14</date>
  </row>
  <row num="7">
    <id>142</id>
    <name>english name 3</name>
    <date>2015-07-03</date>
  </row>
  <row num="8">
    <id>152</id>
    <name>тоже</name>
    <date>2013-11-17</date>
  </row>
</table>


XPath "/table/row" - исправно возвращает коллекцию узлов row. Что ещё может быть не так?
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39152140
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvg,

приведите пример отредактированного файла, и кода, которым вы пытаетесь получить узлы.
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39152267
anvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны , большое спасибо за участие и потраченное время.
Поставил XML-Notepad. Он сразу выбросил ошибку, что используется атрибут x14ac:dyDescent не объявленным пространством имён. Пошёл искать, где почитать про использование пространств имён. :)
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39152283
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так вернуть его и всё. выкинуть нужно было только xmlns='http://schemas.openxmlformats.org/spreadsheetml/2006/main'
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39152732
anvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток.
Antonariy , большое спасибо за ваш вариант. Да, так работает. Пытаюсь разобраться с http://zajtcev.org/docs/w3c/ru/xml-names11-second-edition.html#defaulting]. Только вот не могу понять, как использовать это самое пространство имён по умолчанию с MSXML2.DOMDocument60. Ведь для чего-то оно объявляется и значит должно свободно использоваться. Предположил, что если в документе определены несколько таких пространств имён по умолчанию, то через
Код: vbnet
1.
Set pSel = pDoc.SelectNodes("//@xmlns")

, как описано тут получу все данные по именам по умолчанию и, воспользовавшись кодом Сон Веры Павловны
Код: vbnet
1.
pDoc.setProperty("SelectionNamespaces", "xmlns:main='http://schemas.openxmlformats.org/spreadsheetml/2006/main'")


задать префиксы имён, а затем использовать по назначению.
Вот только pDoc.SelectNodes("//@xmlns") возвращает пустой список атрибутов :( И что в таком случае делать?
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39152973
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xmlns="..." это, как говорят, не совсем атрибут. в коллекции Attributes он есть, но xpath с ним не работает.

по всей видимости, только регэкспом выдергивать: xmlns=["'][^"']*["']
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39153176
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyxmlns="..." это, как говорят, не совсем атрибут. в коллекции Attributes он есть, но xpath с ним не работает.
по всей видимости, только регэкспом выдергивать: xmlns=["'][^"']*["']
Ничего подобного, для неймспейсов существует ось namespace::. Только и тут есть нюансы:
1. В XPath 2.0 эта ось deprecated. Ну да до XPath/XSLT 2.0 микрософтовским парсерам еще не скоро.
2. Неймспейсы на самом деле есть у каждого элемента. Даже если они в разметке явно объявлены только на корневом элементе, их наследуют все дочерние элементы, и запрос //namespace::* выдаст коллекцию узлов, размер которой равен x*y, где x - количество элементов в документе, у=количество объявленных неймспейсов корневого узла+1 (про +1 ниже). В реальности это число может быть больше, т.к. могут быть задану какие-то другие доп. неймспейсы ниже по иерархии.
3. Даже если в документе нигде нет ни одного объявления неймспейсов, все равно запрос //namespace::* выдаст коллекцию узлов, размер которой равен количеству элементов в документе, т.к. у этих элементов неймспейс по умолчанию - xmlns:xml=" http://www.w3.org/XML/1998/namespace"
Если надо с помощью XPath выбрать объявления неймспейсов какого-то одного узла - например, корневого - то тут подойдет такой XPath: /*/namespace::*
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39153216
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныНичего подобного, для неймспейсов существует ось namespace::.не юзал ее, как-то вообще мимо внимания прошла.
...
Рейтинг: 0 / 0
Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
    #39153322
anvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны , Antonariy - огромное спасибо за советы и решения!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Почему не отрабатывается XPath с MSXML2.DOMDocument60 на таком xml-файле?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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