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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:15:22