Главная страница
    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.005 c
2-1416664103
Drowsy
2014-11-22 16:48
2016.07.24
Почему не очищаются Columns in DBGrid?


15-1445415222
кгшзх
2015-10-21 11:13
2016.07.24
прикладная конспирология


15-1444426204
Юрий
2015-10-10 00:30
2016.07.24
С днем рождения ! 10 октября 2015 суббота


15-1445594070
ksergey
2015-10-23 12:54
2016.07.24
Организация API для сторонних приложений: какие технологии?


15-1445526860
Dimka Maslov
2015-10-22 18:14
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский