XML 中的 ﹤![CDATA[ ]]>

本文详细介绍了XML中CDATA段的作用与用法,解释了如何避免解析器对CDATA内的特殊字符进行解析,同时提供了使用CDATA的具体实例及解析CDATA的方法。

XML 中的 <![CDATA[ ]]>

因为这个是xml格式的,所以不允许出现类似“>”这样的字符
CDATA 全名:character data。所有 XML 文档中的文本均会被解析器解析除了 CDATA 区段(CDATA section)中的文本会被解析器忽略。

CDATA的形式如下: <![CDATA[文本内容]]>

CDATA的文本内容中不能出现字符串**“]]>”**。另外,CDATA不能嵌套

XML 实例: 在CDATA标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记。 CDATA区域是由 <![CDATA[ 为开始标记,以 ]]> 为结束标记,注意CDATA为大写

QDom 解析 xml 中的CDATA

<Data>
   <![CDATA[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]]>
</Data>

例如:

 <select id="getRecords" resultType="com.domain.zft.contentmanage.model.vo.SysNoticeVO">
        SELECT
            csn.*,
            sc.`cityname` AS city_name,
        CASE

                WHEN (csn.effective_time <![CDATA[<=]]> now() AND csn.fail_time <![CDATA[>=]]> now()) THEN
                '生效'
                ELSE
                '失效'
            END status_name,
            su.`name` AS update_by_name
        FROM
            `conm_sys_notice` AS csn
            LEFT JOIN sys_organization AS so ON so.id = csn.city_id
            AND so.is_deleted = 0
            LEFT JOIN sys_city AS sc ON sc.id = so.relation_id
            AND sc.is_deleted = 0
            LEFT JOIN sys_user AS su ON su.id = csn.update_by
        <trim prefix="WHERE" prefixOverrides="AND |OR ">
            csn.is_deleted = 0
            <if test="cityId != null" >
                AND
                csn.city_id = #{cityId}
            </if>
            <if test="title != null and title != ''" >
                AND
                csn.title LIKE concat ('%', #{title}, '%')
            </if>
            <if test="status != null and status != ''" >
                /* 1 代表生效 */
                <if test="status == 1">
                    AND
                    (csn.effective_time <![CDATA[<=]]> now() AND csn.fail_time <![CDATA[>=]]> now())
                </if>
                /* 2 代表失效 */
                <if test="status == 2">
                    AND
                    (csn.effective_time <![CDATA[>=]]> now() OR csn.fail_time <![CDATA[<=]]> now())
                </if>
            </if>
        </trim>
        ORDER BY
        csn.id DESC
        <if test="offset != null and pageSize != null">
            limit #{offset}, #{pageSize}
        </if>
    </select>

第二种方法:

用了转义字符把>和<替换掉,然后就没有问题了。

XML转义字符

### 如何在 SQL 查询中处理 XML CDATA 段 当涉及到在SQL查询中处理XMLCDATA部分时,主要关注的是如何确保特定的数据不会被解析器解释为标记。CDATA区段允许开发者将数据放入其中而不必担心这些数据中的任何字符会被视为XML标签的一部分。 对于SQL Server而言,在创建含有CDATA区段的XML字符串时,可以通过`FOR XML PATH`的方式构建所需的XML结构,并利用T-SQL函数来插入CDATA区段[^2]。下面是一个简单的例子展示怎样实现这一点: ```sql SELECT 1 AS Tag, NULL AS Parent, 'Some text that should not be parsed as XML' AS [description!1!!cdata] FOR XML EXPLICIT; ``` 此代码片段会生成如下形式的结果: ```xml <description><![CDATA[Some text that should not be parsed as XML]]></description> ``` 值得注意的是,虽然上述方法适用于某些场景下的CDATA区段创建,但在现代版本的SQL Server中推荐使用更简洁的方法——通过`FOR XML PATH`配合自定义属性名的方式来达到相同效果。例如: ```sql SELECT ( SELECT description FROM your_table_name yt WHERE yt.id = outer_query.id FOR XML PATH(''), TYPE).value('.','nvarchar(max)' ) AS [text()] FROM your_outer_table_name outer_query FOR XML PATH('rootElementName'), ELEMENTS XSINIL; ``` 在这个例子中,内部子查询返回的内容将会自动转换成CDATA区段内的文本,前提是该内容确实需要作为未解析的字符流传递给接收端应用。 另外需要注意的一点是在Oracle数据库环境中操作CDATA也有相似的需求和解决方案。由于CDATA区段不允许嵌套其他CDATA区段,并且不能包含序列"]]>",所以在准备要放置于CDATA之内的数据前应当对其进行适当清理以移除可能引起冲突的模式[^3]。 最后提醒一点关于转义字符的问题:即使在一个CDATA区内,仍然要注意避免直接写入可能会干扰XML文档结构的特殊字符组合,比如单独出现的大括号闭合符">]"或三个连续右方括号"]]>][^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值