使用lxml.etree无需循环如何获取XML任意层级指定元素的首个属性值
解决方案
方案1:直接读取迭代器首个元素(无显式for循环)
state.iter()返回的是迭代器对象,不需要遍历所有元素,直接用next()函数即可取到第一个匹配的元素,全程不需要写显式的for循环。如果要处理元素不存在的场景,可以给next()加第二个参数作为默认返回值,避免抛出StopIteration异常。
注意:你原有代码里
XML()方法是用来接收XML字符串的,读取本地XML文件需要改用parse()方法
import lxml.etree as LET state = LET.parse("state.xml") variable = "ObjectId" # 直接取首个匹配元素的value属性 first_obj = next(state.iter(variable), None) value = first_obj.attrib.get("value") if first_obj is not None else None print(value) # 输出:Obj1
方案2:使用XPath路径直接定位
用XPath语法//元素名可以匹配所有层级的对应元素,搭配find()方法会直接返回第一个匹配到的元素,写法更直观。
import lxml.etree as LET state = LET.parse("state.xml") variable = "ObjectId" first_element = state.find(f".//{variable}") value = first_element.attrib.get("value") if first_element is not None else None print(value) # 输出:Obj1
两种方案都只会扫描到第一个匹配元素就停止,不需要遍历整个XML结构,性能比全量遍历的写法更好。
内容的提问来源于stack exchange,提问作者Scf_suedbaden
相关产品推荐
相关产品推荐

