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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:18:07