XPath: получить родительский узел из дочернего узла
мне нужно получить родительский узел для дочернего узла "title 50"
на данный момент я использую только
//*[title="50"]
как я могу получить его родителя?
Результат должен быть store
узел.
<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
<store d:mi="22">
<book price="12.99" d:price="Number" d:mi="4">
<title d:constr="String" d:mi="1">Sword of Honour</title>
<category d:constr="String" d:mi="2">fiction</category>
<author d:constr="String" d:mi="3">Evelyn Waugh</author>
</book>
<book price="8.99" d:price="Number" d:mi="9">
<title d:constr="String" d:mi="5">Moby Dick</title>
<category d:constr="String" d:mi="6">fiction</category>
<author d:constr="String" d:mi="7">Herman Melville</author>
<isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
</book>
<book price="8.95" d:price="Number" d:mi="13">
<title d:constr="String" d:mi="10">50</title>
<category d:constr="String" d:mi="11">reference</category>
<author d:constr="String" d:mi="12">Nigel Rees</author>
</book>
<book price="22.99" d:price="Number" d:mi="18">
<title d:constr="String" d:mi="14">The Lord of the Rings</title>
<category d:constr="String" d:mi="15">fiction</category>
<author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
<isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
</book>
<bicycle price="19.95" d:price="Number" d:mi="21">
<brand d:constr="String" d:mi="19">Cannondale</brand>
<color d:constr="String" d:mi="20">red</color>
</bicycle>
</store>
</d:data>
4 ответа:
использовать
parent
оси С именем родительского узла.//*[title="50"]/parent::store
этот XPath будет выбирать только родительский узел, если он
store
.но вы также можете использовать один из этих
//*[title="50"]/parent::* //*[title="50"]/..
эти xpaths будут выбирать любой родительский узел. Поэтому, если документ изменяется, вы всегда будете выбирать узел, даже если это не тот узел, который вы ожидаете.
EDIT
что происходит в данный пример, где родитель-велосипед, но родитель родителя-магазин?
он поднимается?
нет, он только выбирает магазин, если он является родителем узла, который соответствует
//*[title="50"]
.если нет, есть ли способ подняться в таких случаях и вернуть None, если такого родителя нет?
Да, вы можете использовать
ancestor
оси//*[title="50"]/ancestor::store
это позволит выбрать все предки узла соответствия
//*[title="50"]
что этоstore
ы. Е. Г.<data xmlns:d="defiant-namespace" d:mi="23"> <store mi="1"> <store mi="22"> <book price="8.95" d:price="Number" d:mi="13"> <title d:constr="String" d:mi="10">50</title> <category d:constr="String" d:mi="11">reference</category> <author d:constr="String" d:mi="12">Nigel Rees</author> </book> </store> </store> </data>