Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Найти все места где есть нужный нод / 9 сообщений из 9, страница 1 из 1
15.02.2016, 20:56
    #39171810
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
Привет. Помогите пожалуйста.
Пытаюсь написать Xpath запрос, который бы возвращал список нод, внутри которых есть нужный мне:

Код: c#
1.
xmlDoc.SelectNodes("ancestor:://Cabinet/Tool")


Но получаю ошибку "Результатом выражения должен быть NodeSet."

Подозреваю, что ошибка специфична для C#, т.к. яндексинг по тексту ошибки почти ничего не дал.

Но также подозреваю, что дело в не верно составленном Xpath.

Исходный документ

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<Doc>
  <Workers>...</Workers>

<Places>
  <Place1>
    <Cabinet>
      <Id>1</ID>      
      <Tool>...</Tool>
    </Cabinet>
  </Place1>

  <Place2>
    <Cabinet>
      <Id>2</ID>      
      <Tool>...</Tool>
    </Cabinet>
  </Place2>

  <Place3>
    <Cabinet>
      <Id>3</ID>      
    </Cabinet>
  </Place3>

</Places>
</Doc>



Соответственно нужно чтобы запрос вернул Place1 и Place2.
...
Рейтинг: 0 / 0
15.02.2016, 21:46
    #39171840
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
ProBiotek,

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl.xsl"?>
<Doc>
  <Workers>...</Workers>

<Places>
  <Place1>
    <Cabinet>
      <Id>1</Id>      
      <Tool>2</Tool>
    </Cabinet>
  </Place1>

  <Place2>
    <Cabinet>
      <Id>2</Id>      
      <Tool>2</Tool>
    </Cabinet>
  </Place2>

  <Place3>
    <Cabinet>
      <Id>3</Id>
    </Cabinet>
  </Place3>
  <Place2>
    <Cabinet>
      <Id>2</Id>      
      <Tool>2</Tool>
    </Cabinet>
  </Place2>
  <Place3>
    <Cabinet>
      <Id>3</Id>
    </Cabinet>
  </Place3>
</Places>
</Doc>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
<root>
<xsl:copy-of select="//Places/child::*[Cabinet/Tool]"/>
</root>
  </xsl:template>
</xsl:stylesheet>


я использовал xsl для проверки xpath, не уверен что понял задачу, но это путь возвращает узлы Place в которых есть Tool
Сам XML был не валидным расхождения в названии узла id , я подправил на свое усмотрение
...
Рейтинг: 0 / 0
15.02.2016, 23:02
    #39171859
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
или так
Код: xml
1.
<xsl:copy-of select="//Tool/ancestor::node()[2]" />
...
Рейтинг: 0 / 0
16.02.2016, 12:18
    #39172140
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
Фридрих,

Извините. Запрос работает, но похоже я ошибся.
Мне нужно чтобы возвращался набор тэгов с именем "Places" (на данном примере XML он только 1 конечно). На том же уровне находится и тэг Workers - он не должен попасть. Только тэг "Places".

Не могу понять как нужно переписать "//Places/child::*[Cabinet/Tool]" - никогда не приходилось с Осями работать.
Помогите пожалуйста.

Для меня проще в программе написать //Places//Tool и затем просто в коде вызвать node.parent.parent. Но это не красиво конечно же. Вот и хотелось найти более красивый способ.
...
Рейтинг: 0 / 0
16.02.2016, 12:57
    #39172194
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
ProBiotek,

можно и так попробывать:
Код: xml
1.
"//Tool/ancestor::node()[3]"



вообще, желательно написать то, что должно быть на выходе.
...
Рейтинг: 0 / 0
16.02.2016, 16:08
    #39172414
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
Фридрих,

Спасибо, собственно "//Tool/ancestor::node()[3]" полностью подошло :) Как просто оказалось.

Я раньше такой синтаксис не использовал.
...
Рейтинг: 0 / 0
16.02.2016, 16:25
    #39172430
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
Фридрих,

Подскажите пожалуйста еще. Есть ли какой-то задачник по Xpath ?
В обычной практике с осями дел не имею, а смотрю они очень полезны. Хотелось бы попрактиковаться.

Сам себе я задачи придумать не смогу. Очевидно не зная тонкостей осей, не смогу придумать задачи, которые решаются именно через оси.
...
Рейтинг: 0 / 0
16.02.2016, 17:48
    #39172517
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
...
Рейтинг: 0 / 0
16.02.2016, 18:43
    #39172554
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все места где есть нужный нод
Фридрих,

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


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