2013-06-05 5 views
1

Синтаксис XML документа:XPath родительского атрибута выбора

<x name="GET-THIS"> 
    <y> 
    <z>Z</z> 
    <z>Z__2</z> 
    <z>Z__3</z> 
    </y> 
</x> 

Я могу получить все элементы Z с помощью:

xpath("//z") 

Но после того, что я застрял, я не конечно, что делать дальше. Я не понимаю синтаксис родительского метода ..

Итак, как мне получить атрибут родителя элемента?

+1

Попробуйте 'xpath (" // x [// z]/@ name ")'. Он выберет элементы 'x', у которых есть элементы' z' в качестве потомков, а затем получите свой атрибут 'name'. – Blender

+0

Это сработало! Спасибо огромное! Добавьте его в качестве ответа, и я соглашусь с ним :) – Kush

ответ

3

Вместо перемещения назад к родителю, просто найти правильный родитель, чтобы начать с:

  • //x подберет все x элементы.
  • //x[//z] выберет все x элементы, которые имеют z элементы как потомки.
  • //x[//z]/@name получит атрибут name каждого из этих элементов.
3

У вас уже есть хороший обслуживаемый ответ, но вот некоторые другие полезные выражения:

  • //z/ancestor::x/@name - Найти <z> элементов в любом месте, а затем найти все предку <x> элементов, а затем name="…" атрибутов их.

  • //z/../../@name - Найти <z> элементы, а затем найти родительский узел (ы) из тех, а затем родительский узел (ы) из тех, а затем атрибут name (ы) конечного множества.

    • Это то же самое, как: //z/parent::*/parent::*/@name, где * означает «элемент с любым именем».
  • // полезен, но неэффективен. Если вы знаете, что иерархия x/y/z, то это более эффективно, чтобы сделать что-то вроде //x[y/z]/@name

+0

Очень полезно, спасибо! – Kush

+0

Для меня это было '*', которое помогло ... Мне нужно, чтобы родительский :: */@ id' работал ... Я попробовал 'parent :: @ id' и' parent ::/@ id' и ни работали. – Nick

0

Я не имею репутацию, поэтому я не могу добавить комментарий к принятому ответ на Blender. Но его ответ не будет работать вообще. Правильная версия

//x[.//z]/@name 

Объяснение простое - при использовании фильтра, как [//z] будет искать «Z» в глобальном контексте, то есть он возвращает истинное если XML содержит, по меньшей мере, один узел г в любой точке XML. Например, он будет выбирать имена обоих из XML ниже:

<root> 
    <x name="NOT-THIS"> 
    </x> 
    <x name="GET-THIS"> 
    <y> 
     <z>Z</z> 
     <z>Z__2</z> 
     <z>Z__3</z> 
    </y> 
    </x> 
</root> 

фильтр [.//z] использовать контекст текущего узла, который x и возвращает только 2-ое имя (.).

Смежные вопросы