如何检查XML中每个subtag的check子元素存在且非空?
问题:检查XML中subtag的check元素有效性
给定如下XML文件:
<?xml version="1.0" encoding="utf-8"?> <components version="1.0.0"> <component type="foo"> <maintag> <subtag> <check>Foo</check> </subtag> <subtag> <check></check> </subtag> <subtag> </subtag> </maintag> </component> </components>
需要检查每个subtag元素是否包含值非空的check子元素,出现以下情况时输出错误:
check元素存在但内容为空- 一个或多个
subtag中完全不存在check元素
用户编写的代码无法完全满足需求:
from lxml import etree # type: ignore def parse_xml(path: str) -> list: root = etree.parse(path) components = root.xpath("/components/component") return list(components) path = "test.xml" for p in parse_xml(path)[0].iter('check'): if not len(str(p)) > 0: print("check tag empty")
解决方案
要覆盖两种错误场景,需要遍历所有subtag元素,逐一检查是否存在check子元素以及其内容是否非空。修改后的代码如下:
from lxml import etree def validate_subtags(path: str): root = etree.parse(path) # 获取所有subtag元素 subtags = root.xpath("//subtag") for idx, subtag in enumerate(subtags, start=1): # 查找当前subtag下的直接子元素check check_elements = subtag.xpath("./check") if not check_elements: print(f"错误:第{idx}个subtag元素缺少check子元素") continue # 提取check元素的文本内容 check_elem = check_elements[0] # 处理文本:若text为None则设为空字符串,否则去除前后空白字符 check_content = check_elem.text.strip() if check_elem.text else "" if not check_content: print(f"错误:第{idx}个subtag中的check元素内容为空") path = "test.xml" validate_subtags(path)
代码说明:
- 遍历所有subtag:通过
//subtagXPath表达式获取XML中所有subtag元素,确保每个都被检查到 - 检查check元素是否存在:对每个
subtag,用./check查找其直接子元素,若结果为空则说明缺少check - 检查check内容是否非空:对于存在的
check元素,处理其文本内容:- 如果
check_elem.text为None(对应<check></check>这种空标签),直接视为空 - 否则去除文本前后的空白字符,判断是否为空字符串
- 如果
- 错误定位:用
enumerate给subtag编号,方便快速定位错误位置
运行上述代码后,会输出:
错误:第2个subtag中的check元素内容为空 错误:第3个subtag元素缺少check子元素
内容的提问来源于stack exchange,提问作者user22990699
相关产品推荐
相关产品推荐

