使用ElementTree时如何添加CDATA标记声明?
问题
在Wix 3.14中需要生成如下检查.NET Framework版本的XML节点:
<Condition Message="This application requires .NET Framework 4.6.2. Please install the .NET Framework then run this installer again."> <![CDATA[Installed OR WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED]]> </Condition>
使用ElementTree编写的创建代码如下,但无法为Condition元素添加CDATA内容:
def add_net462_prerequisite(self, parent): condition = ET.SubElement( parent, "Condition", Message="This application requires .NET Framework 4.6.2. " "Please install the .NET Framework then run this installer again.", )
解决方案
ElementTree原生未提供直接创建CDATA节点的API,但可以通过两种可靠方式实现:
方法一:自定义CDATA节点类型并注册序列化器
通过自定义CDATA类并注册对应的序列化逻辑,确保输出时保留CDATA格式:
import xml.etree.ElementTree as ET # 自定义CDATA节点类 class CDATA(ET.Element): def __init__(self, text): super().__init__('![CDATA[') self.text = text # 注册CDATA节点的序列化处理器 def serialize_cdata(elem, encoding, default_namespace): return f'<![CDATA[{elem.text}]]>'.encode(encoding) ET.register_namespace('', 'http://schemas.microsoft.com/wix/2006/wi') # 注册Wix默认命名空间,避免前缀 ET._serialize['![CDATA['] = serialize_cdata # 修改后的添加方法 def add_net462_prerequisite(self, parent): condition = ET.SubElement( parent, "Condition", Message="This application requires .NET Framework 4.6.2. Please install the .NET Framework then run this installer again." ) # 添加CDATA内容 cdata_content = CDATA("Installed OR WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED") condition.append(cdata_content)
方法二:通过XML字符串解析生成CDATA节点
直接解析包含CDATA的XML片段,将生成的节点添加到Condition元素中:
import xml.etree.ElementTree as ET def add_net462_prerequisite(self, parent): condition = ET.SubElement( parent, "Condition", Message="This application requires .NET Framework 4.6.2. Please install the .NET Framework then run this installer again." ) # 解析CDATA片段为节点并添加 cdata_node = ET.fromstring('<![CDATA[Installed OR WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED]]>') condition.append(cdata_node)
注意事项
- 若Wix XML使用命名空间,必须调用
ET.register_namespace注册对应命名空间,避免生成多余的前缀(如ns0:)。 - 两种方法均能保证序列化后的XML输出符合要求,可根据代码复杂度选择适用方案。
内容的提问来源于stack exchange,提问作者user1765812
相关产品推荐
相关产品推荐

