powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XPath c xmlns
8 сообщений из 8, страница 1 из 1
XPath c xmlns
    #39036420
Амата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, уважаемые!

Есть необходимость делать выборки из XML документа с xmlns, но что-то не пойму, как это делать правильно.
Вот пример документа:
/DOC/DATA/RECORD/REFERENCE[@REFTYPE="Test"]/DESC
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0"?>
<DOC xmlns="urn:schemas-test-com/doc.xml">hello
  <DATA>
    <RECORD xmlns="urn:www-test-com/schema/index.xml">
      <REFERENCE REFTYPE="Test">
        <DESC>Reference</DESC>
      </REFERENCE>
    </RECORD>
  </DATA>
</DOC>



В обычном случае нужное мне решалось бы так:
xpath/DOC/DATA/RECORD/REFERENCE[@REFTYPE="Test"]/DESC
Здесь это не проходит.
Даже чтобы получить простенькое "hello" пробовалось по-всякому:
xpath/DOC/*[local-name(.) = '*']xpath/DOC*[local-name(.) = '*']xpath/DOC[local-name(.) = '*']xpath/DOC/*[namespace-uri()='urn:schemas-test-com/doc.xml']xpath/DOC*[namespace-uri()='urn:schemas-test-com/doc.xml']xpath/DOC[namespace-uri()='urn:schemas-test-com/doc.xml']

Увы, безрезультатно. Результат получился только через это:
xpath//*[namespace-uri()='urn:schemas-test-com/doc.xml']
Но как прикрутить его к запросу вида "/DOC/DATA/RECORD/REFERENCE[@REFTYPE="Test"]/DESC" - понять не могу, тут даже два разных xmlns вставить надо, а я вот с одним не справлюсь. Просветите, будьте так добры!
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036443
Амата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашлось одно решение. Выглядит жутковато, но работает:

xquery/*[name()='DOC']/*[name()='DATA']/*[name()='RECORD']/*[name()='REFERENCE'][@REFTYPE="Test"]/*[name()='DESC']
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036453
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это зависит от среды, в которой выполняется XPath. Например, при использовании .Net и System.Xml используется XmlNamespaceManager , для Saxon используется метод XPathCompiler.DeclareNamespace , в мозилловском диалекте JS используется XPathNSResolver , итд итп.
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036486
Амата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это в TXMLDocument (Delphi).
Сейчас вот ещё одна проблема назрела: нужно получать выборки из нодлиста, и когда пытаешься сделать так:
Код: pascal
1.
2.
3.
NodeList := (ADOMNode as IDOMNOdeSelect).selectNodes('/*[name()='DOC']/*[name()='DATA']/*[name()='RECORD']');
if NodeList.length > 0 then
  Node := (NodeList[0] as IDOMNOdeSelect).selectNode('REFERENCE/DESC');


то NodeList содаржит выборку, а вот Node остаётся nil (aka NULL). Если же вместо 'REFERENCE/DESC' передать '*[name()='REFERENCE']/*[name()='DESC']' (а также без первого символа *) - ругается на непрапвильный XPath.

А как тогда сделать правильно? Мне выборка нужна для списка однотипных элементов.
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036496
Амата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Туплю.... Вот оно решение:
Код: xml
1.
Node := (NodeList[0] as IDOMNOdeSelect).selectNode('./*[name()='REFERENCE']/*[name()='DESC']');


Всем спасибо :)
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036563
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АматаЭто в TXMLDocument (Delphi).
Код: pascal
1.
2.
3.
4.
5.
6.
var doc: IXMLDOMDocument2;
begin
  doc := CreateComObject(CLASS_DOMDocument60) as IXMLDOMDocument2;
  doc.load(.....);
  doc.setProperty('SelectionNamespaces', 'xmlns:d="urn:schemas-test-com/doc.xml" xmlns:i="urn:www-test-com/schema/index.xml"');
  doc.selectSingleNode('/d:DOC/d:DATA/i:RECORD/i:REFERENCE[@REFTYPE="Test"]/i:DESC')
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036635
Drunky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там TXMLDocument используется, что в принципе грамотнее использования MSXML_TLB в виду того, что с обновлением Windows приходится либо перекомпилировать с новым TLB файлом, либо устанавливать более старую версию MSXML (если это возможно).
...
Рейтинг: 0 / 0
XPath c xmlns
    #39036771
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drunkyс обновлением Windows приходится либо перекомпилировать с новым TLB файлом, либо устанавливать более старую версию MSXML (если это возможно).Чего??? Сатурну больше не наливать
DrunkyТам TXMLDocument используетсяА Вы считаете, что TXMLDocument это собственная разработка Borland/Embarcadero?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XPath c xmlns
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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