2013-03-27 6 views
1

Рассмотрим этот XML Файловая структураПолучить атрибут где Subtag имеет атрибут х

... 
<sometag attr="foobar"> 
    <subtag> 
     <subsubtag someattr="foo" /> 
     <subsubtag someattr="bla" /> 
     <subsubtag someattr="bar" /> 
    </subtag> 
</sometag> 
... 

В настоящее время я этот XPath запрос: /sometag/subtag/subsubtag[@someattr='foo'] который получает меня эти subsubtags. Можно ли получить attr="foobar" по этому запросу? поэтому я хочу иметь все attr от sometag, где есть subsubtag с someattr="foo".

ответ

1

О файле XML:

<root> 
<sometag attr="foobar1"> 
    <subtag> 
    <subsubtag someattr="foo"/> 
    <subsubtag someattr="bla"/> 
    <subsubtag someattr="bar"/> 
    </subtag> 
</sometag> 
<sometag attr="foobar2"> 
    <subtag> 
    <subsubtag someattr="foo"/> 
    <subsubtag someattr="bla"/> 
    <subsubtag someattr="bar"/> 
    </subtag> 
</sometag> 
<sometag attr="foobar3"> 
    <subtag> 
     <subsubtag someattr="f2342oo" /> 
     <subsubtag someattr="bla" /> 
     <subsubtag someattr="bar" /> 
    </subtag> 
</sometag> 
</root> 

попробовать:

/root/sometag/subtag/subsubtag[@someattr='foo']/../../@attr 

Я сделал быстрый тест на here, и это, кажется, работает для меня.

+0

почему ответ был первым удален? Ошибка stackoverflow? – reox

+0

нет, я сначала сделал ошибку, и я выбрал весь элемент 'sometag', а не только @attr; перед тем, как написать полный ответ, я должен был провести некоторое тестирование, и я не хотел, чтобы мой плохой ответ был видимым в то же время. – ionutab

+0

странно ... потому что я хотел его принять, а затем получил сообщение об ошибке «ответ был удален» ... – reox

2

другая возможность я только что узнал:

/sometag/subtag/subsubtag[@someattr='foo']/../../@attr 

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

1
/sometag[subtag/subsubtag[@someattr="foobar"]]/@attr 

или менее строго:

// sometag [// subsubtag [@ someattr = "Foobar"]]/@ атр

+0

вы можете сказать, будет ли этот метод быстрее, чем другой? Есть ли разница в XPath Compiler, или он уменьшит его до того же самого AST? – reox

+0

Первый метод будет быстрее второго (в большинстве случаев, который зависит от конкретного механизма XPath), потому что во втором методе некоторые процессоры XPath будут пересекать больше узлов, чтобы найти тег. Вам нужно использовать первый или второй? Это зависит. Если это дерево HTML, то я бы использовал второй, потому что я не хочу изменять выражение XPath каждый раз при изменении макета HTML. Если это документ XML, я бы придерживался первого метода. –

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