在具有特定路径的 lxml 树中查找元素

Find elements in lxml tree with specific paths

假设我有一个 XML 文件如下:

my_data.xml

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <country name="Liechtenstein" xmlns="aaa:bbb:ccc:liechtenstein:eee">
    <rank updated="yes">2</rank>
    <holidays>
      <christmas>Yes</christmas>
    </holidays>
    <year>2008</year>
    <gdppc>141100</gdppc>
    <neighbor name="Austria" direction="E"/>
    <neighbor name="Switzerland" direction="W"/>
  </country>
  <country name="Singapore" xmlns="aaa:bbb:ccc:singapore:eee">
    <continent>Asia</continent>
    <holidays>
      <christmas>Yes</christmas>
    </holidays>
    <rank updated="yes">5</rank>
    <year>2011</year>
    <gdppc>59900</gdppc>
    <neighbor name="Malaysia" direction="N"/>
  </country>
  <country name="Panama" xmlns="aaa:bbb:ccc:panama:eee">
    <rank updated="yes">69</rank>
    <year>2011</year>
    <gdppc>13600</gdppc>
    <neighbor name="Costa Rica" direction="W"/>
    <neighbor name="Colombia" direction="E"/>
  </country>
  <ethnicity xmlns="aaa:bbb:ccc:ethnicity:eee">
    <malay>
      <holidays>
        <ramadan>Yes</ramadan>
      </holidays>
    </malay>
  </ethnicity>
</data>

解析后:

xtree = etree.parse('my_data.xml')
xroot = xtree.getroot()

我想搜索标签为 holidays 的元素,但只能在 ethnicity 的路径下搜索。 这一行:

holiday_nodes = xroot.xpath('.//*[local-name()="holidays"]')

会给我所有的节假日节点,像这样:

[<Element {aaa:bbb:ccc:liechtenstein:eee}holidays at 0x19013f926c0>, 
<Element {aaa:bbb:ccc:singapore:eee}holidays at 0x19013f92880>, 
<Element {aaa:bbb:ccc:ethnicity:eee}holidays at 0x19012cdc0c0>]

实现此搜索的语法是什么?谢谢。

尝试以下 xpath...

.//*[local-name()="ethnicity"]//*[local-name()="holidays"]

使用

.//*[local-name()="ethnicity"]//*[local-name()="holidays"]

并且如果 malay 始终是介于两者之间的元素,则使用以获得更好的性能

.//*[local-name()="ethnicity"]/*[local-name()="malay"]/*[local-name()="holidays"]