如何用Python解析类XML的Scribus .sla文件并替换CH属性内容?
解析非标准XML格式Scribus .sla文件并替换ITEXT标签CH属性的方案
方法1:正则表达式直接匹配替换
如果你的.sla文件中
示例代码:
import re def replace_ch_attribute(file_path, old_ch_value, new_ch_value): with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 匹配带CH属性的ITEXT标签,支持标签内存在其他属性的情况 pattern = re.compile(r'(<ITEXT[^>]*CH=")' + re.escape(old_ch_value) + r'("[^>]*>)') modified_content = pattern.sub(r'\1' + new_ch_value + r'\2', content) # 保存修改后的文件,避免覆盖原文件 with open(file_path.replace('.sla', '_modified.sla'), 'w', encoding='utf-8') as f: f.write(modified_content) # 使用示例 replace_ch_attribute('your_file.sla', 'old_content', 'new_content')
如果需要替换所有ITEXT标签的CH属性(不管原有值),可将正则调整为r'(<ITEXT[^>]*CH=")[^"]*(")',直接替换引号内的内容。
方法2:用lxml的容错模式解析
lxml库对非标准XML的兼容性远优于Python标准库的xml.etree.ElementTree,开启recover=True模式后可忽略多数格式错误(如未闭合标签、特殊字符未转义等)。
先安装lxml:
pip install lxml
示例代码:
from lxml import etree def modify_ch_with_lxml(file_path, new_ch_value): # 启用恢复模式解析非标准XML parser = etree.XMLParser(recover=True) tree = etree.parse(file_path, parser) # 遍历所有ITEXT标签,修改CH属性 for itext in tree.xpath('//ITEXT'): if 'CH' in itext.attrib: itext.set('CH', new_ch_value) # 保存修改后的文件 tree.write('modified_file.sla', encoding='utf-8', xml_declaration=True) # 使用示例 modify_ch_with_lxml('your_file.sla', 'updated_ch_content')
该方法适合文件接近标准XML但存在少量格式问题的场景,能准确处理标签层级,比正则更可靠。
方法3:逐行手动处理
如果文件格式严重违反XML规范(如标签随意换行、属性格式混乱),可逐行读取文件,针对包含
示例代码:
def modify_ch_line_by_line(file_path, new_ch_value): modified_lines = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: if '<ITEXT' in line and 'CH="' in line: # 定位CH属性的内容区间并替换 start_pos = line.find('CH="') + 4 end_pos = line.find('"', start_pos) if start_pos != -1 and end_pos != -1: line = line[:start_pos] + new_ch_value + line[end_pos:] modified_lines.append(line) with open('modified_file.sla', 'w', encoding='utf-8') as f: f.writelines(modified_lines) # 使用示例 modify_ch_line_by_line('your_file.sla', 'new_ch_text')
这种方法灵活性最高,能应对各种非常规格式问题,但无法处理跨多行的
内容的提问来源于stack exchange,提问作者JB B
相关产品推荐
相关产品推荐

