Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

java XPath   Найти похожие ветки 

 
Юрий Зотов ©   (2015-10-13 12:25) [0]

Обращаюсь к знатокам XPath (весь об(г)углился уже).

Есть такой XML:

<корень>
 <стаж> (таких узлов 6)
   <деятельность>
     <вид> имя_вида </вид> (таких узлов 1)
     <все_периоды>
       <период> (таких узлов N в каждом узле "все_периоды")
         <начало> дата_начала  </начало>
         <конец> дата_конца </конец>
       <период>
     <все_периоды>
   <деятельность>
 </стаж>
...
</корень>


Нужно вытащить такие данные (всего 6*N элементов):

имя_вида1 дата_начала1 дата_конца1
...
имя_вида1 дата_началаN дата_концаN
имя_вида2 дата_начала1 дата_конца1
...
имя_вида2 дата_началаN дата_концаN
...
имя_вида6 дата_начала1 дата_конца1
...
имя_вида6 дата_началаN дата_концаN


Пишу путь:
/корень/стаж/деятельность/вид

Как и ожидалось, получаю все 6 видов. Теперь надо получить все даты начала и конца, но не в куче, а с разбивкой по видам.

Полагая, что после выполнения предыдущего запроса контекстным узлом является <вид>, для получения даты начала пишу такой путь:
.//ancestor::деятельность/descendant::начало

При этом ожидаю получить N дат, а получаю все 6*N. В итоге выборка включает не 6*N элементов, а 6*6*N.

Пробовал разные варианты второго запроса - ну  никак не получается.
Предполагаю, что контекстный узел остается на корне, а не на <вид>, где я его ожидаю. Значит, либо надо установить контекстный узел куда надо (но как?), либо изменить второй запрос (но как?).

Други, вспоможите, сами мы не местные... ну не знаток я XPath.
:o)


 
Владислав ©   (2015-10-13 12:32) [1]

Тоже не знаток, но в таких случаях пользовался книжкой: Мангано Сэл. XSLT. Сборник рецептов.
Может поможет.
PS: В интернете есть.


 
virex(home) ©   (2015-10-13 12:54) [2]


> разные варианты второго запроса

не в тему, но если это можно сделать в базе, то можно попробовать так (ms sql 2012):

declare @XML XML =
"<корень>
<стаж id="1">
  <деятельность>
    <вид> имя_вида1 </вид>
    <все_периоды>
      <период>
        <начало> дата_начала1 </начало>
        <конец> дата_конца1 </конец>
      </период>
    </все_периоды>
  </деятельность>
</стаж>
<стаж id="2">
  <деятельность>
    <вид> имя_вида2 </вид>
    <все_периоды>
      <период>
        <начало> дата_начала2 </начало>
        <конец> дата_конца2 </конец>
      </период>
    </все_периоды>
  </деятельность>
</стаж>
</корень>"

SELECT
   ID = Events.value("@id", "int"),
   вид =Events.value("(деятельность/вид)[1]", "varchar(20)"),
   [дата_начала] =Events.value("(деятельность/все_периоды/период/начало)[1]", "varchar(20)"),
[дата_конца] =Events.value("(деятельность/все_периоды/период/конец)[1]", "varchar(20)")
FROM
@XML.nodes("/корень/стаж") AS tbl(Events)


 
кгшзх ©   (2015-10-13 13:33) [3]

имя_вида1 дата_начала1 дата_конца1

//деятельность/вид[@имявида="моеимявида"]//период/*


 
кгшзх ©   (2015-10-13 13:38) [4]

Теперь надо получить все даты начала и конца, но не в куче, а с разбивкой по видам.


IXMLDOMNodelist (или его аналог в других изыках) - одномерный список.
так что разбивки никакой не будет


 
Юрий Зотов ©   (2015-10-13 15:02) [5]

> кгшзх ©   (13.10.15 13:33) [3]

Так ведь @ - это атрибут, а в файле атрибутов нет. Или я неверно понимаю?

А если так:

1. Получаем список NodeList (в нем 6 узлов):
/корень/стаж/деятельность/вид

2. Идем в цикле for по этому списку (i - счетчик цикла)

3. Получаем даты начала (N штук)
/корень/стаж/деятельность[i]/все_периоды/период/начало

4. Аналогично получаем даты конца (N штук)
/корень/стаж/деятельность[i]/все_периоды/период/конец


 
Юрий Зотов ©   (2015-10-13 15:53) [6]

Уфф... справился...

Всем спасибо за подсказки. Как обычно - проблему надо проговорить, тогда и решение приходит.


 
DayGaykin ©   (2015-10-13 16:47) [7]

А как же забота о тех, кто тему в поиске найдет?


 
Юрий Зотов ©   (2015-10-13 16:59) [8]

> DayGaykin ©   (13.10.15 16:47) [7]

[5] сработало.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
15-1441127797
Pavia
2015-09-01 20:16
2016.07.24
Хочу пример таблицы


15-1447832032
Dimka Maslov
2015-11-18 10:33
2016.07.24
Вот интересно


15-1444728307
Юрий Зотов
2015-10-13 12:25
2016.07.24
java XPath


15-1443532985
Дмитрий Белькевич
2015-09-29 16:23
2016.07.24
Ищу реализацию алгоритма SIFT на Delphi


15-1445622452
Rouse_
2015-10-23 20:47
2016.07.24
Сели тут со знакомым и за два дня ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский