私はいくつかのlxmlのコードを実行するが、違いが何であるかを理解していないです - 私は、直接の親の下に子を選択します:XPath lxml Pythonを使用して直接の子供を選択する方法?
xml = '<parent><child></child><parent>'
root = lxml.etree.fromstring(xml)
root.xpath('child')
と「./child」:
root.xpath('child')
私はいくつかのlxmlのコードを実行するが、違いが何であるかを理解していないです - 私は、直接の親の下に子を選択します:XPath lxml Pythonを使用して直接の子供を選択する方法?
xml = '<parent><child></child><parent>'
root = lxml.etree.fromstring(xml)
root.xpath('child')
と「./child」:
root.xpath('child')
あなたは要素を選択すると、軸なしで、それは省略構文です:
child::the_element
は
に等しく、 10the_element
明示的コンテキストとして現在のコンテキストを使用し
期間とスラッシュ(./)付い式現在のコンテキスト。例えば、以下の式は、現在のコンテキスト内のすべての要素を意味する:これは以下と等価であること
./author
注
author
この状況では、式child
と./child
は同じ与えます結果。これは、child
がコンテキストノードを暗黙的に前提としているためです。これはXPathでは.
と呼ばれます。コンテキストノードがPython/lxml/your documentにあることを確認するには、単純に.
を評価してください。整形式エラーにつながっているだろう、あなたのXML文書にタイプミスを修正した後:
あなたが見ることができるように、parent
要素は、この文書に対して評価された任意のXPath式の暗黙のコンテキストがあります。
しかし、./
は式から省略することはできませんが、必要なシナリオがあります。たとえば、コンテキストノード以外の要素のすべての子孫を検索する場合は、.//descendant
と//descendant
を使用すると間違った結果が生じる可能性があります。
たとえば、要素other
がchild
要素の子孫であれば見つけたいと考えてください。あなたの文書には、次のようになります。
>>> 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を返します正しい結果。