在具有特定路径的 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"]
假设我有一个 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"]