python xpath 表达式查找包含给定文本的任何属性

问题描述 投票:0回答:1
python xml xpath
1个回答
0
投票

正如评论中所述,lxml 是更好的方法。没有 xpath 的替代解决方案:

import xml.etree.ElementTree as ET

xml_s = """<RootNode>
         <SubNode name="MainNode" SubNodeID="1">
           <SubSubNode SubSubID="10" SubSubName="Product Food">
             <Item subItemID="100" ItemName="Apple" OtherName="Gala"/>
             <Item subItemID="101" ItemName="Apple" OtherName="Aroma"/>
             <Item subItemID="102" ItemName="Pear" OtherName="Williams"/>
             <Item subItemID="103" ItemName="Pear" OtherName="Abate"/>
             <Item subItemID="104" ItemName="Cranberry" OtherName="Bilberry"/>
             <Item subItemID="105" ItemName="Cranberry" OtherName="Bluberries"/>
             <Item subItemID="106" ItemName="Strawberry" OtherName="some text"/>
             <Item subItemID="107" ItemName="Peach" OtherName="Nectarina"/>
          </SubSubNode>
          <SubSubNode SubSubID="20" SubSubName="Product Beverage">
            <Item subItemID="108" ItemName="Cola" OtherName="Coca cola"/>
            <Item subItemID="109" ItemName="Cola" OtherName="Pepsi"/>
            <Item subItemID="110" ItemName="Orange Juice" OtherName="Fanta"/>
            <Item subItemID="111" ItemName="Soft drink" OtherName="Grape soda"/>
            <Item subItemID="112" ItemName="some text" OtherName="Orange soda"/>
            <Item subItemID="113" ItemName="Soft drink" OtherName="Grape soda"/>
          </SubSubNode>
        </SubNode>
    </RootNode>"""

root = ET.fromstring(xml_s)

element_list = []
for some_text in root.iter():
    if "some text" in some_text.attrib.values():
        # print(some_text.tag, some_text.attrib)
        element_list.append(some_text)
        
# Or find the keys with some text
for elem in element_list:
    keys = [k for k, v in elem.attrib.items() if v == 'some text']
    print(keys)

输出:

['OtherName']
['ItemName']
© www.soinside.com 2019 - 2024. All rights reserved.