使用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 & 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 & 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 & No ]]></Text>
总结
- 别用jQuery的
html()处理XML节点,它会破坏XML的特殊结构; - 直接操作原生XML DOM节点,能精准获取CDATA和属性的原始内容;
- 用
XMLSerializer可以生成和原始XML格式一致的字符串,完美保留所有细节。
内容的提问来源于stack exchange,提问作者Rus
相关产品推荐
相关产品推荐

