• XML中文本节点存储任意字符的方法


    XML

      xml是一种可扩展标签语言, 为众多浏览器支持解析, ajax更是利用xml来完成服务器和客户端之前的通信。

      xml基本元素为 <label>xxx</label>, 并支持嵌套, 即标签的内容, 既可以是文本, 又可以是另外一个基本元素。

      语法介绍 : http://www.w3school.com.cn/xml/xml_syntax.asp

    XML转义字符

      xml标签之间的内容,如果是文本的时候, 文本的内容中, 不能含有 < 和 & 字符,

    否则会导致xml解析失败, 因为<被认为是标签开始的标识, 不应该出现的文本内容中,

    &字符被认为是实体转义开始的标识, 所以这些字符都需要转义为实体形式:

    <message>if salary &lt; 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转义, 将所有可见字符转为实体引用,

    即时, 将 & 转为 &amp; 

      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[&#60;&#33;&#91;&#67;&#68;&#65;&#84;&#65;&#91;&#93;&#93;&#62;]]></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>

     

  • 相关阅读:
    学习笔记9(必做)
    团队作业(四):描述设计
    改进ls的实现(课下作业)
    stat命令的实现-mysate(必做)
    反汇编测试
    学习笔记8(必做)
    初次使用git上传代码到码云
    团队作业(三):确定分工
    学习笔记7(必做)
    缓冲区溢出漏洞实验
  • 原文地址:https://www.cnblogs.com/lightsong/p/3854378.html
Copyright © 2020-2023  润新知