2017-01-24 45 views

答えて

0

あなたは要素を選択すると、軸なしで、それは省略構文です:

child::the_element 

に等しく、 10
the_element 

明示的コンテキストとして現在のコンテキストを使用し

期間とスラッシュ(./)付い式現在のコンテキスト。例えば、以下の式は、現在のコンテキスト内のすべての要素を意味する:これは以下と等価であること

./author 

author 
1

この状況では、式child./childは同じ与えます結果。これは、childコンテキストノードを暗黙的に前提としているためです。これはXPathでは.と呼ばれます。コンテキストノードがPython/lxml/your documentにあることを確認するには、単純に.を評価してください。整形式エラーにつながっているだろう、あなたのXML文書にタイプミスを修正した後:

​​

あなたが見ることができるように、parent要素は、この文書に対して評価された任意のXPath式の暗黙のコンテキストがあります。

しかし、./は式から省略することはできませんが、必要なシナリオがあります。たとえば、コンテキストノード以外の要素のすべての子孫を検索する場合は、.//descendant//descendantを使用すると間違った結果が生じる可能性があります。

たとえば、要素otherchild要素の子孫であれば見つけたいと考えてください。あなたの文書には、次のようになります。

>>> xml = '<parent><other find="no"/><child><other find="yes"/></child></parent>' 
>>> root = lxml.etree.fromstring(xml) 

そして、あなたは最初child要素になります。

>>> child = root.xpath('child')[0] 

次にコンテキストとしてこの要素を使用してXPath式を評価する:

>>> child.xpath('//other') 
[<Element other at 0x1038446c8>, <Element other at 0x105380348>] 
>>> child.xpath('.//other') 
[<Element other at 0x105380348>] 

とでこの場合、XPath式の先頭にある.は結果リストに実際に影響を与えます。.//otherはthを返します正しい結果。

関連する問題