XML中文本节点存储任意字符的方法
XML
xml是一种可扩展标签语言, 为众多浏览器支持解析, ajax更是利用xml来完成服务器和客户端之前的通信。
xml基本元素为 <label>xxx</label>, 并支持嵌套, 即标签的内容, 既可以是文本, 又可以是另外一个基本元素。
语法介绍 : http://www.w3school.com.cn/xml/xml_syntax.asp
XML转义字符
xml标签之间的内容,如果是文本的时候, 文本的内容中, 不能含有 < 和 & 字符,
否则会导致xml解析失败, 因为<被认为是标签开始的标识, 不应该出现的文本内容中,
&字符被认为是实体转义开始的标识, 所以这些字符都需要转义为实体形式:
<message>if salary < 1000 then</message>
对于xml字符串,不管是xml标签的内容是文本,还是另外一个基本元素, 都需要经过xml解析器解析
解析过程一则耗时, 二则对于一些乱码字符(0-32 or 127-255)的存在解析器也容易报错,
也会解析终止,则xml字符中其他的部分不能被顺利解析出来。
对于这种情况,介绍一种可尝试的方法cdata。
XML CDATA
xml的所有字符都需要被解析器解析, 但是xml语法告诉我们,可以通过特殊声明(CDATA = Charactor Data 字符数据 ),
让标签的文本内容,不用经过解析。 只需要给 文本内容添加特殊的 开始和结束标记。
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束。
这样上面的例子可写为, < 使用原样书写,这就是cdata的好处,
一些人为书写的js脚本中含有大于号的, 可以通过这种方法注释掉,以通过xml校验(http://www.xmlvalidation.com/):
<message><![CDATA[if salary < 1000 then]]></message>
CDATA不足与应对
不足CDATA内容不能 再含有 CDATA的开始 和 结束标记,否则会打断CDATA解析,
这样就意味着CDATA的内容不能为任意字符串。
要想让CDATA存储任意内容,则转码必不可少, 则解析结果不是原始内容, 需要经过反转码,将结果还原。
方法:将CDATA存储的文本字符串, 全部使用HTMLEncode转义, 将所有可见字符转为实体引用,
即时, 将 & 转为 &
JS取到CDATA内容后, 再通过HTMLDecode反转码。
CDATA应用例子
<![CDATA[]]>为XML的文本内容,被转义为 实体引用, 后组成 xml 字符串,送到xml解析器中,构造出xml dom树,
js获取到cdata内容后, 使用HTMLDecode反转还原。
<html>
<head>
<script type="text/javascript" src="./JQuery.js"></script>
<style>
</style>
</head>
<body> <script type='text/javascript'>
txt="<bookstore><book>";
//txt=txt+"<title><![CDATA[Everyday <<>>></<></<></<>Italian]]></title>";
txt=txt+"<title><![CDATA[<![CDATA[]]>]]></title>";
//txt=txt+"<title>Everyday <<>>></<></<></<>Italian</title>"; //OK
txt=txt+"<author>Giada De Laurentiis</author>";
txt=txt+"<year>2005</year>";
txt=txt+"</book></bookstore>";
if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(txt);
} var cdata = xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue
console.log(cdata) function HTMLDecode(text)
{
var temp = document.createElement("div");
temp.innerHTML = text; var output = temp.innerText || temp.textContent;
temp = null;
return output;
}
console.log(HTMLDecode(cdata)) </script>
</body>
</html>
XML中文本节点存储任意字符的方法的更多相关文章
- XML中的五个保留字符及实体引用
字符名称 字符 实体引用 和 & & 大于号 > > 小于号 < < 单引号 ‘ ' 双引号 “ " 在XML文档中,构成元素内 ...
- SpringMVC项目中web.xml中的节点载入顺序问题
SpringMVC项目中web.xml中的节点载入顺序问题,之前以为web.xml中就是一些配置信息,和节点的顺序没有关系.后来才发现初始化时的载入顺序是和节点的顺序相关的. 完整的web.xml文件 ...
- Dom4j向XML中增加节点与属性——(四)
先获取到节点,然后在节点山添加Element 添加节点 添加属性 设置开始标签与结束标签的值book.addElement("描述").addAttribute("nam ...
- XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。
示例Xml: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?xml versio ...
- DOM中文本节点索引方法
问题 对于 jquery 接口text()只能取到有标签的 dom对象中 文本内容. 如果索引对象本身就是文本节点,则不好索引到, 没有相关的索引选择器. 例如: 对于<input>aaa ...
- [转]XML中必须进行转义的字符
转自:http://jaenson.iteye.com/blog/945469 编写XML代码经常遗漏的常识: XML实体中不允许出现"&","<" ...
- (转)XML中必须进行转义的字符
场景:在工作中接触到很多xml文件,为了更好的操作这些文件,所有很有必要熟知xml文件的相关语义. 1 引入 编写XML代码经常遗漏的常识: XML实体中不允许出现"&", ...
- python文本 单独处理每个字符的方法汇总
python文本 单独处理字符串每个字符的方法汇总 场景: 用每次处理一个字符的方式处理字符串 方法: 1.使用list(str) >>> a='abcdefg' >&g ...
- C#删除xml中某个节点的子节点方法
if (File.Exists(xmlFilePath)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFilePath); Xm ...
随机推荐
- dom事件不求甚解,色解事件捕获和冒泡
以前对事件只会用jq的bind绑定一下,脑海里留着书中的事件循环,一直认为事件就是这儿循环的,最近看园子里的文章,对事件的了解更模糊了 所以我做了个小实验,总结一下看的这些零零碎碎的文章,如果总结错了 ...
- IE6下div层被select控件遮住的问题解决方法
Select在IE6下是处于最顶层的,因此想要遮住它,设置zIndex属性是不行的,就需要一个优先级更高的元素,就是iframe,当把iframe嵌套在弹出div层中后,把iframe设置为不可见,但 ...
- PL/SQL无法连接,提示:pl/sql initialization error sql*net not properly installed
各种找资料都不行,最后还是在公司的线上环境中去找不同点配置好的.不多说了,就做了如下配置: 服务器环境是:windows server 2008 64位操作系统 1.电脑系统环境变量PATH增加:x: ...
- C#常用方法二
public sealed class StringTool { /// <summary> /// 将txt文件读入字符串 /// </summary> /// <pa ...
- Linux 的cp命令
Linux 的cp命令 功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若 ...
- Java生成动态GIF图片
写selenium自动化时,为了查看运行效果,后给浏览器截图,想到可以生成gif图片来快速预览.看到已经有人实现了,直接拿过来. 共涉及到三个java文件,分别是NeuQuant.java,LZWEn ...
- 【Go语言】I/O专题
本文目录 1.bytes包:字节切片.Buffer和Reader 1_1.字节切片处理函数 1_1_1.基本处理函数 1_1_2.字节切片比较函数 1_1_3.字节切片前后缀检查函数 1_1_4.字节 ...
- 1022. D进制的A+B (20)
1022. D进制的A+B (20) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 输入两个非负10进制整数A和 ...
- if分支练习
1.输入三个整数,xyz,最终以从小到大的方式输出.利用嵌套. 方法一: 方法二: 2.输入一个小于等于100的整数,判断: //是小于10的 //两位数 //是100 3.//输入学生姓名,输入 ...
- 在cenOS下安装apache出现-bash: /etc/init.d/httpd: 没有那个文件或目录
我是在vmware上装的centos7,使用命令yum install httpd httpd-devel 安装完apache后,想要启动apache,执行了/etc/init.d/httpd sta ...