powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XPath в выборке
6 сообщений из 6, страница 1 из 1
XPath в выборке
    #35277275
Youra Polishuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь сделать выборку из документа MS Word 2003 (сохраненного как XML с оформлением).
Файлик находится в бд PostgreSQL 8.3.1.
Может я неправильно использую XPath?
Вот пример запроса:

Код: plaintext
1.
2.
3.
SELECT id,class,
xpath('//ns0:Vid//text()', XMLPARSE(DOCUMENT xml),ARRAY[ARRAY['ns0', 'urn:spisok_rabot']])
FROM test4
WHERE id= 8 
Вот результат:

Код: plaintext
1.
2.
id	class	                     xpath
 8 	Список трудов.xml	        {ст,а,тья,ст,а,тья}
Вот то что находится между тегами <ns0:Vid> </ns0:Vid>
Выбираем что между тегами:

Код: plaintext
1.
2.
3.
SELECT
xpath('//ns0:Vid', XMLPARSE(DOCUMENT xml),ARRAY[ARRAY['ns0', 'urn:spisok_rabot']])
FROM test4
WHERE id= 8 

Код: 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.
{""<ns0:Vid>
  <w:p wsp:rsidR=\""893ED0\"" wsp:rsidRPr=\""891748\"" wsp:rsidRDefault=\""00893ED0\"" wsp:rsidP=\""00891748\"">
    <w:r wsp:rsidRPr=\""00891748\"">
      <w:t>ст</w:t>
    </w:r>
    <w:r wsp:rsidRPr=\""00891748\"">
      <w:t>а</w:t>
    </w:r>
    <w:r wsp:rsidRPr=\""00891748\"">
      <w:t>тья</w:t>
    </w:r>
  </w:p>
</ns0:Vid>"",""<ns0:Vid>
  <w:p wsp:rsidR=\""00893ED0\"" wsp:rsidRPr=\""00891748\"" wsp:rsidRDefault=\""00893ED0\"" wsp:rsidP=\""00891748\"">
    <w:r wsp:rsidRPr=\""00891748\"">
      <w:t>ст</w:t>
    </w:r>
    <w:r wsp:rsidRPr=\""00891748\"">
      <w:t>а</w:t>
    </w:r>
    <w:r wsp:rsidRPr=\""00891748\"">
      <w:t>тья</w:t>
    </w:r>
  </w:p>
</ns0:Vid>""}"
Как убрать теги лишние, чтобы слово было целеком.
Такая ситуация возникает из-за переносов теста в яцейке таблицы.
...
Рейтинг: 0 / 0
XPath в выборке
    #35277496
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как я понял, проблема в том, что xpath возвращает массив узлов, с которым сервер пытается что-то сделать и такое получается. Проконсультируйся со спецами по mssql.
...
Рейтинг: 0 / 0
XPath в выборке
    #35277505
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой… или это постгря?
...
Рейтинг: 0 / 0
XPath в выборке
    #35278296
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваше xpath-выражение возвращает набор из нескольких узлов, то все что он (xpath) с ним сможет дальше сделать это разве что применить какие-нть базовые функции типа count. Никаких других функций для работы с nodeset-ами у него нет. Собсно это и не его задача, у xpath-а вполне определенная узкая цель - адресация узлов в xml-документах. Т.е. выбрали вы 6 текстовых узлов - он 6 вернул.
И даже если бы вы выбрали 1 узел, все равно это был бы узел (текстовый) документа, а не строковое значение. Поэтому например в Оракле есть просто extract, возвращающий XMLType - набор узлов, и extractValue, возвращающий строковое значение узла (причем он должен быть один). Здесь думается то же самое - то что вы видите как {ст,а,тья,ст,а,тья} это не строка, а строковое представление вашим инструментом постгресовского типа-аналога ораклового XMLType.
Но с текстовыми узлами есть такая особенность - при канонической сериализации соседние текстовые узлы объединяются. Т.е. вам надо каким-то образом сериализовать получившийся набор узлов. Например в Оракле я могу это сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  extract(
    xmltype('<r><a>qw</a><a>er</a><a>ty</a></r>'), 
    'r//text()'
  ) node_set_result,
  extract(
    xmltype('<r><a>qw</a><a>er</a><a>ty</a></r>'), 
    'r//text()'
  ).getStringVal() serialized_result
from dual
(правда sql*plus и то и другое отображает одинаково, поскольку хоть и получает значение типа XMLType, но для отображения неявно вызывает тот же самый .getStringVal() :))

так что вам надо просто порыться в доках по постгресу поискать подобные методы сериализации ;-)
...
Рейтинг: 0 / 0
XPath в выборке
    #35279335
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TiGНо с текстовыми узлами есть такая особенность - при канонической сериализации соседние текстовые узлы объединяются.вроде по правилам XPath при преобразовании nodeset в строку остаётся только первый узел. А вот преобразование элемента в строку – это уже конкатенация дочерних текстовых узлов, так что возможно поможет string(//ns0:Vid[1]).
...
Рейтинг: 0 / 0
XPath в выборке
    #35280095
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo TiGНо с текстовыми узлами есть такая особенность - при канонической сериализации соседние текстовые узлы объединяются.вроде по правилам XPath при преобразовании nodeset в строку остаётся только первый узел. А вот преобразование элемента в строку – это уже конкатенация дочерних текстовых узлов, так что возможно поможет string(//ns0:Vid[1]).
а ведь ты прав, поскольку нужны вообще все дочерние текстовые узлы, то это будет именно то что нужно

PS а всего то надо было чуток абстрагироваться от первоначально предлагаемого топикстартером решения

PPS хотя нет буду считать что это у меня вчера сказался конец рабочего дня ;-)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XPath в выборке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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