Форум: "Прочее";
Текущий архив: 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