You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取XML文件时xpath无法匹配sheetProtection节点问题求助

问题原因

你的XML文件定义了默认命名空间http://schemas.openxmlformats.org/spreadsheetml/2006/main,所有无前缀的节点(包括worksheet、sheetProtection)都归属于该命名空间。lxml的XPath查询要求显式指定命名空间才能匹配到带命名空间的节点,你当前的XPath未指定命名空间,无法匹配到目标节点,因此不会进入for循环执行逻辑。

解决方法

方案1:显式指定命名空间查询(推荐)

先定义命名空间映射,再在XPath路径中给对应节点加上命名空间前缀即可,修改后代码如下:

tree = etree.parse(f'{newTempFolder}/xl/worksheets/sheet2.xml')
print(f'My tree: {tree}')
# 定义命名空间映射,前缀可自定义,和后续XPath保持一致即可
ns = {'ss': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'}
# 每个无前缀的节点都要加上你定义的命名空间前缀
for elem in tree.xpath('.//ss:worksheet//ss:sheetProtection', namespaces=ns):
    print('Here we go...')
    parent = elem.getparent()
    parent.remove(elem)
# 注意:修改后需要将内存中的树写回文件,修改才会生效
tree.write(f'{newTempFolder}/xl/worksheets/sheet2.xml', encoding='UTF-8', xml_declaration=True)

方案2:用local-name()忽略命名空间匹配(适合快速调试)

如果你不想处理命名空间,可以用XPath的local-name()函数直接匹配节点名称,跳过命名空间校验:

tree = etree.parse(f'{newTempFolder}/xl/worksheets/sheet2.xml')
print(f'My tree: {tree}')
for elem in tree.xpath('.//*[local-name()="worksheet"]//*[local-name()="sheetProtection"]'):
    print('Here we go...')
    parent = elem.getparent()
    parent.remove(elem)
# 同样需要写回文件
tree.write(f'{newTempFolder}/xl/worksheets/sheet2.xml', encoding='UTF-8', xml_declaration=True)

内容的提问来源于stack exchange,提问作者Felipe Dourado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:36:03