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

使用Pyparsing解析类XML自定义格式并实现外部文件值修改

问题修复方案

语法与逻辑错误修正

  • 字典定义语法错误:你定义的valuesToUpdate多了一行无效空字符串,首先修正语法:
valuesToUpdate = {
    "building": "home"
}
  • 解析结果无name属性:当前所有解析规则都没有给匹配字段设置命名,所以tokens.name永远不存在,判断始终不成立进入else分支。需要给需要匹配修改的字段加结果命名,比如要识别building标签就修改为:
nameBuilding = Literal("building").setResultsName("name")

其他需要修改的字段如position、direction等,也按照这个规则加对应命名即可。

  • 未绑定解析动作:你写的updateSelectedDefinitions函数没有通过addParseAction绑定到对应解析规则上,解析过程不会触发该函数。比如要在匹配building标签时执行更新,需要加绑定逻辑:
buildingzahl.addParseAction(updateSelectedDefinitions)
  • Suppress使用不当:你把所有<>、[]都设置为Suppress,解析时会直接丢弃这些结构符号,后续修改后无法重建原始格式。建议只把无用内容设为Suppress,保留结构符号的匹配。
  • 转义字符匹配错误:你在解析规则里写的Literal("&lt;...")是错的,&lt;是HTML转义后的显示内容,实际文件里的起始符号是<,直接写<才能匹配到对应内容。
  • 更新函数逻辑错误:
    1. 原代码return "%" % tokens.name, newVal格式化语法完全错误,需要按照你的自定义脚本格式拼接修改后的内容
    2. 不需要修改的标签不要抛异常,直接返回原始tokens即可,不然会中断解析流程
      修正后的更新逻辑示例:
def updateSelectedDefinitions(tokens):
    if "name" in tokens and tokens.name in valuesToUpdate:
        new_val = valuesToUpdate[tokens.name]
        # 按照你的原始格式拼接修改后的标签,此处以building标签为例
        return f"<[{new_val}][element][{tokens[0]}]>"
    # 不需要修改的内容直接返回原内容
    return tokens

内容写回逻辑补充

你当前的代码只有解析逻辑,没有修改后写回文件的步骤。如果要生成修改后的完整文件,建议使用Pyparsing的transformString方法,自动应用所有解析动作返回修改后的完整字符串:

modified_content = fileganz.transformString(toc)
with open("修改后的文件路径", "w", encoding="utf-8") as f:
    f.write(modified_content)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:07