如何用Python ElementTree定位XML中指定dateTypeCode的日期节点
解决思路
核心是先定位到包含日期和类型的父节点<CI_Date>,在这个节点内同时获取日期值和对应的类型标识,天然保留二者的配对关系,避免误修改。
实现步骤及代码
- 处理XML命名空间:XML中用到
gco前缀,需先定义命名空间映射,确保ElementTree能正确解析带前缀的节点。 - 遍历
<CI_Date>节点:每个<CI_Date>是日期和类型的共同父容器,遍历它即可同时拿到对应的日期节点和类型属性。 - 根据
codeListValue匹配目标节点:提取每个<CI_Date>内CI_DateTypeCode的codeListValue属性,判断是否为目标类型(如revision),找到后修改对应<gco:Date>的文本值。
示例代码:
import xml.etree.ElementTree as ET # 定义命名空间映射 namespaces = { 'gco': 'http://www.isotc211.org/2005/gco' } # 加载XML文件(若为字符串可改用ET.fromstring) tree = ET.parse('your_target.xml') root = tree.getroot() # 遍历所有CI_Date节点,每个节点对应一组日期+类型 for ci_date in root.findall('.//CI_Date'): # 获取当前节点的日期类型标识 type_code_node = ci_date.find('./dateType/CI_DateTypeCode') if not type_code_node: continue target_type = type_code_node.get('codeListValue') # 定位到该组对应的日期节点 date_node = ci_date.find('./date/gco:Date', namespaces) if not date_node: continue # 根据类型修改日期,示例:修改revision类型日期为2024-01-01 if target_type == 'revision': date_node.text = '2024-01-01' # 可扩展其他类型的修改逻辑 elif target_type == 'creation': date_node.text = '2024-02-01' # 保存修改后的XML tree.write('modified_xml.xml', encoding='utf-8', xml_declaration=True)
方案优势
原迭代函数会将日期和类型节点拆分为独立实体遍历,丢失了二者的关联关系。而以<CI_Date>为单位遍历,天然保留了日期与类型的配对逻辑,代码更简洁,定位也更精准。
内容的提问来源于stack exchange,提问作者atkamminga28
相关产品推荐
相关产品推荐

