Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1444580103
DayGaykin
2015-10-11 19:15
2016.07.24
Удивительный QuickSort


15-1444080601
Юрий
2015-10-06 00:30
2016.07.24
С днем рождения ! 6 октября 2015 вторник


15-1441852590
MonoLife
2015-09-10 05:36
2016.07.24
И почту Yahoo заблокировали


15-1442108456
Сергей Суровцев
2015-09-13 04:40
2016.07.24
С Днем Программиста!


15-1442343788
DayGaykin
2015-09-15 22:03
2016.07.24
Копирование потока без хвоста.