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

使用jQuery解析含CDATA的XML字符串时遇到的内容获取问题

解决jQuery解析XML时html()方法导致的CDATA丢失和属性引号问题

嘿,我完全懂你遇到的困扰——用jQuery处理XML的时候,html()方法确实会掉链子,毕竟它本来就是为HTML DOM设计的,对XML里的CDATA、特殊实体和属性引号的处理方式完全不对路。咱们来一步步解决这两个问题:

为什么html()会出问题?

jQuery的html()方法在处理内容时,会自动把XML里的CDATA块剥离,还会按照HTML的规则调整属性的引号格式(比如把单引号换成双引号),这就导致你拿不到原始的XML内容了。

解决方案:用原生XML DOM方法替代html()

既然你已经用$.parseXML()把字符串转成了XML DOM,不如直接操作原生的XML节点,这样能完美保留所有原始结构:

1. 保留并获取CDATA内容

CDATA在XML DOM里是一个单独的CDATASection节点,你可以直接访问它的nodeValue来获取原始内容,不会被解析或修改:

const rawXML = `<Root> <Text Title='my "best" text'><![CDATA[ Yes &amp; No ]]></Text> </Root>`;
// 解析XML得到原生文档对象
const xmlDoc = $.parseXML(rawXML);
// 找到目标Text节点
const $textNode = $(xmlDoc).find('Text');

// 获取CDATA节点的原始内容
const cdataContent = $textNode[0].childNodes[0].nodeValue;
console.log(cdataContent); // 输出:Yes &amp; No

2. 保留属性的原始格式(或获取正确属性值)

如果是要获取属性的真实值,不管引号格式,用原生的getAttribute()方法就可以:

const titleValue = $textNode[0].getAttribute('Title');
console.log(titleValue); // 输出:my "best" text

要是你需要生成和原始XML完全一致的节点字符串(包括单引号属性),可以用原生的XMLSerializer来序列化节点:

const serializer = new XMLSerializer();
const textXmlString = serializer.serializeToString($textNode[0]);
console.log(textXmlString); 
// 输出:<Text Title='my "best" text'><![CDATA[ Yes &amp; No ]]></Text>

总结

  • 别用jQuery的html()处理XML节点,它会破坏XML的特殊结构;
  • 直接操作原生XML DOM节点,能精准获取CDATA和属性的原始内容;
  • 用XMLSerializer可以生成和原始XML格式一致的字符串,完美保留所有细节。

内容的提问来源于stack exchange,提问作者Rus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:21