使用xml.etree.ElementTree编辑L5X文件时CDATA丢失问题求助
问题:xml.etree.ElementTree修改L5X文件后CDATA丢失
我用xml.etree.ElementTree可以正常解析L5X文件,但修改后文件出现异常。原文件里Rung 0的<Text>标签内容是用CDATA包裹的:
</Rung> <Rung Number="0" Type="N"> <Text> <![CDATA[[XIC(start);]]> </Text>
修改后文本内容变更,但CDATA被删除,变成:
</Rung> <Rung Number="0" Type="N"> <Text>XIC(start);</Text>
想问这是库的格式处理错误,还是我的操作有误?相关代码如下:
import xml.etree.ElementTree as ET xmlfile = (r"C:\Users\burgeB9\Desktop\L5X_Editor\MES Core Build\_002_IGNITION_DATA_OVERALL_MACHINE.L5X") tree = ET.parse(xmlfile) RSLogix5000Content = tree.getroot() #ET.dump(tree) # Select Rung 0 Rung0 = RSLogix5000Content.find(".//Rung[@Number= '0']/Text") print(Rung0.tag, Rung0.attrib, Rung0.text) # Change Value in Rung 0 for Rung in RSLogix5000Content.findall(".//Rung[@Number= '0']/Text"): Rung.text = "XIC(START);" print(Rung.tag, Rung.attrib, Rung.text) """tree.write(xmlfile[:-4]+ "edit_XML")"""
解答
这不是你的操作错误,是xml.etree.ElementTree的默认行为导致的:
- 解析XML时,CDATA段会被自动解析为普通文本,
Element.text仅能获取CDATA内部的字符串,不会保留CDATA的结构标记 - 当你修改
Rung.text并写入文件时,库默认直接输出文本内容,不会自动用CDATA包裹
如果需要保留CDATA结构,你需要手动创建CDATA节点并替换原有内容,而非直接修改text属性。示例代码如下:
import xml.etree.ElementTree as ET xmlfile = r"C:\Users\burgeB9\Desktop\L5X_Editor\MES Core Build\_002_IGNITION_DATA_OVERALL_MACHINE.L5X" tree = ET.parse(xmlfile) RSLogix5000Content = tree.getroot() # 定位目标Text节点 text_node = RSLogix5000Content.find(".//Rung[@Number='0']/Text") # 清空节点原有内容 text_node.clear() # 创建CDATA段并添加到Text节点 cdata_content = ET.CDATA("XIC(START);") text_node.append(cdata_content) # 写入文件时指定编码和XML声明,避免编码问题 tree.write(xmlfile[:-4] + "_edit_XML.L5X", encoding='utf-8', xml_declaration=True)
注意事项
- 必须使用
ET.CDATA()创建CDATA对象,再通过append()方法添加到目标节点,不能直接赋值给text属性 - 写入文件时建议指定编码(如
utf-8)和xml_declaration=True,避免因编码问题导致文件损坏
内容的提问来源于stack exchange,提问作者Alloutnoob
相关产品推荐
相关产品推荐

