`
Dream.V
  • 浏览: 32295 次
社区版块
存档分类
最新评论

Dom4j格式化转义字符问题

    博客分类:
  • XML
XML 
阅读更多

今天在公司碰到了个问题,用Dom4J写XML出问题。。看了这个帖子后果断解决了,,mark一下。。再次谢谢原作者:http://lavasoft.blog.51cto.com/62575/347348

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);
分享到:
评论

相关推荐

    Dom 4j 格式化xml补充

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

    DOM4J从基础到精通

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

    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