`

Dom4j格式化转义字符问题

阅读更多

1、不得不说的XML CDATA部件

  在XML文档中的所有文本都会被解析器解析。

  只有在CDATA部件之内的文本会被解析器忽略。

  不合法的XML字符必须被替换为相应的实体。

  如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。

&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; ' 单引号
&quot; " 双引号

实体必须以符号"&"开头,以符号";"结尾。
注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。

CDATA部件
在CDATA内部的所有内容都会被解析器忽略。

  如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。

  一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:

CDATA注意事项:
CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果 CDATA部件包含了字符"]]>" 或者"<![CDATA[" ,将很有可能出错哦。

  同样要注意在字符串"]]>"之间没有空格或者换行符。

  2、Dom4j格式化转义字符问题

  person.xml

<?xml version="1.0" encoding="UTF-8"?> 
<person> 
        <name>张三</name> 
        <addr><![CDATA[经三路<鑫苑>19F]]></addr> 
</person>

  上面的XML在被Dom4j格式化的时候,自动会被转义,转义后的内容如下:

<?xml version="1.0" encoding="GBK"?>
<person>
  <toname>&lt;![CDATA[经三路&lt;鑫苑&gt;19F]]&gt;</toname>
</person>

  这样,显然不是想要的结果,因为CDATA不需要再转义了。如何处理该问题,看下面的程序的处理:

import org.dom4j.Document; 
import org.dom4j.DocumentHelper; 
import org.dom4j.Element; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.XMLWriter; 
import java .io.IOException; 
import java.io.StringWriter; 
import java.util.Date; 
/** 
* Created by IntelliJ IDEA. 
* 
* @author leizhimin 2010-7-10 16:03:39 
*/ 
public class Person { 
        private String name; 
        private String addr; 
        public Person(String name, String addr) { 
                this.name = name; 
                this.addr = addr; 
        } 
        public static void main(String[] args) { 
                Person p = new Person("张三", "经三路<鑫苑>19F"); 
                p.showXml(); 
        } 
        public void showXml() { 
                String xml1, xml2, xml3; 
                Document doc = DocumentHelper.createDocument(); 
                doc.setXMLEncoding("GBK"); 
                Element root = doc.addElement("person"); 
                if (addr != null) 
                        addElement(root, "toname", "<![CDATA[" + this.addr + "]]>"); 
                else 
                        addElement(root, "toname", this.addr); 
                xml1 = doc.asXML();                                        //默认转义 
                xml2 = formatXml(doc, "GBK", true);        //转义 
                xml3 = formatXml(doc, "GBK", false);     //不转义 
                System.out.println(xml1); 
                System.out.println("-------------------------"); 
                System.out.println(xml2); 
                System.out.println("-------------------------"); 
                System.out.println(xml3); 
        } 
        /** 
         * 在指定的元素下添加一个新的子元素 
         * 
         * @param e         父元素 
         * @param name    子元素名 
         * @param value 子元素值 
         * @return 新加子元素 
         */ 
        public static Element addElement(Element e, String name, Object value) { 
                Element x = e.addElement(name); 
                if (value == null || "".equals(value.toString().trim())) { 
                        x.setText(""); 
                } else if (value instanceof Date) { 
                        x.setText(DateToolkit.toISOFormat((Date) value)); 
                } else { 
                        x.setText(value.toString()); 
                } 
                return x; 
        } 
        /** 
         * 格式化XML文档 
         * 
         * @param document xml文档 
         * @param charset    字符串的编码 
         * @param istrans    是否对属性和元素值进行转移 
         * @return 格式化后XML字符串 
         */ 
        public static String formatXml(Document document, String charset, boolean istrans) { 
                OutputFormat format = OutputFormat.createPrettyPrint(); 
                format.setEncoding(charset); 
                StringWriter sw = new StringWriter(); 
                XMLWriter xw = new XMLWriter(sw, format); 
                xw.setEscapeText(istrans); 
                try { 
                        xw.write(document); 
                        xw.flush(); 
                        xw.close(); 
                } catch (IOException e) { 
                        System.out.println("格式化XML文档发生异常,请检查!"); 
                        e.printStackTrace(); 
                } 
                return sw.toString(); 
        } 
}

  输出结果:

<?xml version="1.0" encoding="GBK"?>
<person><toname>&lt;! [CDATA[经三路&lt;鑫苑&gt;19F]]&gt;</toname></person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<person>
  <toname>&lt;![CDATA[经三路&lt;鑫苑&gt;19F]]&gt;</toname>
</person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<person>
  <toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>

Process finished with exit code 0

  可以看出,最后一种输出是真正想要的结果。

  因此,要控制转义的问题,必须对XML重新格式化,格式化的时候,需要设置:

  xw.setEscapeText(false);

  出处http://lavasoft.blog.51cto.com/62575/347348

分享到:
评论

相关推荐

    Dom 4j 格式化xml补充

    通过上述介绍,我们可以清楚地了解到 Dom 4j 如何帮助我们格式化 XML 输出并设置输出字符集。正确使用这些方法不仅可以提高代码的可读性和维护性,还能确保输出的 XML 文档符合预期的格式要求。

    DOM4J从基础到精通

    #### 四、使用DOM4J修改XML文件 修改XML文件包括增加、删除或更新元素及属性。使用DOM4J进行这些操作非常直观。 ```java // 更新属性值 root.addAttribute("新属性名", "新属性值"); // 删除元素 root.remove...

    dom4j使用简介

    - **XML数据的转换**:通过XPath和XSLT支持,DOM4J可以方便地实现XML数据的转换和格式化。 - **XML数据的验证**:利用DTD或Schema(XSD)验证XML数据的正确性,确保数据的有效性和一致性。 #### 五、总结 DOM4J是...

    Javascript格式化并高亮xml字符串的方法及注意事项

    总的来说,通过DOMParser和递归遍历XML树,我们可以有效地格式化和高亮XML字符串。这种方法在调试、查看或展示XML数据时非常有用。记住,虽然大部分现代浏览器都支持DOMParser,但在旧版本的IE中可能需要寻找替代...

    XML格式化源码

    4. **处理特殊字符**:XML中的特殊字符(如"、"&")需要转义,格式化时要确保它们正确地被转义和展示。 5. **性能优化**:对于大型XML文件,格式化过程可能会消耗大量资源。因此,源码需要考虑性能优化,如使用流式...

    html富文本离线转换输出自带标签和内容的字符串、编辑内容并输出其相应编辑后的格式字符串

    5. **字符串输出**:编辑完成后,我们需要将富文本内容转化为格式化的字符串,这涉及到HTML实体的转义,以防止在非HTML环境中显示特殊字符。例如,`需要转换为`&lt;`,`&gt;`转换为`&gt;`。此外,还可能需要去除不必要...

    XML格式化工具

    其次,处理特殊字符,如将"&"转义为"&amp;",确保XML的合法性;最后,根据用户需求,可能还包括调整输出格式,比如控制缩进的空格数、是否保留空白等。 总的来说,这款XML格式化工具提供了方便快捷的方式对XML文档...

    解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题

    为了提高用户体验,通常会采用格式化输入的方式,将银行卡号每四位用特定的符号(如“-”)进行分隔,以方便用户阅读和输入。本文将详细介绍如何在Vue项目中实现银行卡号的格式化。 ### Vue项目中实现银行卡号格式...

    基于PHP的JSON格式化工具(基于web的视图工具) php版.zip

    4. **数据格式化**:为了使JSON易于阅读,工具可能使用了递归函数或者数组操作来添加缩进和换行,同时可能还实现了颜色编码以突出关键数据。 5. **前端交互**:除了后端PHP处理,前端JavaScript也可能被用来处理...

    RTF文件的解析及交互设计

    5. **转义字符处理**:RTF文档中的汉字等非ASCII字符通过转义字符序列表示。例如,“\'cb\'ce\'cc\'e5”表示汉字“宋体”。解析时需将这些转义字符转换为对应的字节序列,再使用相应的编码格式进行解码。 6. **关键...

    js处理网页编辑器转义、去除转义、去除HTML标签的正则

    用户可以通过这些编辑器输入格式化的文本,插入图片、表格甚至是多媒体元素,并在网页上展示这些内容。然而,这种灵活性也带来了潜在的安全风险,尤其是跨站脚本攻击(XSS)风险,因此,为了保证网页内容的安全性,...

    js的XML解析器 可以解析XMl文件和XML字符串

    - **特殊字符**:XML文档中可能存在特殊字符,如`、`&gt;`、`&`等,这些在XML中具有特殊含义,需要正确转义。如果未正确处理,可能导致解析错误。 - **浏览器兼容性**:描述中提到的谷歌浏览器的XML解析问题可能是指...

    java一键xml转map,一键map转xml工具类

    在XML和Map的转换过程中,可能用到了如`dom4j`或`jaxb`等库,它们提供了方便的XML操作API。这些库可以通过Maven引入,添加到项目的pom.xml文件中。例如,`dom4j`的依赖可以这样写: ```xml &lt;groupId&gt;dom4j ...

    jquery源码 带格式

    - `rvalidescape`: 用于匹配JSON字符串中的转义字符的正则表达式。 - `rvalidtokens`: 用于匹配JSON字符串中的合法标记(如字符串、布尔值、数字等)的正则表达式。 #### 字符串转换 - `rmsPrefix`: 用于检测字符...

    JS实现将二维数组转为json格式字符串操作示例

    最后,文档中推荐了一些在线工具,这些工具可以用来检验、美化或格式化JSON数据,便于开发者更好地查看和调试JSON数据。在进行Web开发时,使用这些在线工具可以提高开发效率,避免在开发过程中出现JSON格式错误等...

    php输出xml格式字符串(用的这个)

    这种语法非常适合构建格式化的XML字符串。 5. **输出XML字符串**:最后,通过`echo $aaa;` 将XML字符串输出到浏览器。 要生成更复杂的XML字符串,可以使用PHP的DOMDocument和DOMElement类,它们提供了更方便的方式...

    js拼接html字符串的注意事项

    当HTML字符串非常长时,应该注意代码的格式化问题。适当的换行和缩进能够帮助开发者更好地理解和维护代码。在拼接字符串时,应保持代码整洁,避免使用冗长的一行代码,这样有利于减少错误和提高代码的可读性。 4. ...

    JSON辅助格式化处理方法

    使用jQuery库来处理DOM操作和AJAX请求,而`JSONFormat.js`则是自定义的JavaScript代码,用于JSON格式化。这展示了在实际项目中,通常会结合使用成熟的库(如jQuery)和自定义脚本来实现特定需求。 通过上述方式,...

Global site tag (gtag.js) - Google Analytics