诡异的dom4j的输出

开发 后端
如果XML里面包含了一些特殊字符,比如 
 这个是line feed,也就是换行符。在经过它输出后总是会变成\n, 不好干预它的转化。下面来看具体的例子。

昨天发现一个问题,使用dom4j的XMLWrtier输出的问题。

首先先说一下现象吧,如果XML里面包含了一些特殊字符,比如 这个是line feed,也就是换行符。在经过它输出后总是会变成\n, 不好干预它的转化。下面来看具体的例子。

这个是原始的xml文件:

Xml代码

 

 

 

 

  1. xml version="1.0" encoding="UTF-8"?>    
  2. <Package id = "test" name = "Test Test">    
  3.          
  4. Package>  

下面是测试代码:

Java代码

  1. package org.powermock.examples.dom4j;     
  2.     
  3. import java.io.BufferedReader;     
  4. import java.io.File;     
  5. import java.io.FileInputStream;     
  6. import java.io.FileOutputStream;     
  7. import java.io.InputStreamReader;     
  8.     
  9. import javax.xml.transform.Transformer;     
  10. import javax.xml.transform.TransformerFactory;     
  11. import javax.xml.transform.stream.StreamResult;     
  12.     
  13. import junit.framework.Assert;     
  14.     
  15. import org.dom4j.Document;     
  16. import org.dom4j.DocumentHelper;     
  17. import org.dom4j.Element;     
  18. import org.dom4j.io.DocumentSource;     
  19. import org.dom4j.io.XMLWriter;     
  20. import org.junit.Test;     
  21.     
  22. public class TestXMLOutput {     
  23.          
  24.     public final static String FILE_NAME = "text.xml";     
  25.          
  26.     @Test    
  27.     public  void testDom4j() {     
  28.     
  29.         Document document = createDocument();     
  30.         try {     
  31.             Element rootElement = document.getRootElement();     
  32.             String packageName = rootElement.attributeValue("name");     
  33.                  
  34.             Assert.assertEquals("Test\nTest", packageName);     
  35.                  
  36.             FileOutputStream fos = new FileOutputStream("dom4j_"+FILE_NAME);     
  37.             XMLWriter writer = new XMLWriter(fos);     
  38.             writer.setEscapeText(false);     
  39.             writer.write(document);     
  40.                  
  41.             fos.close();     
  42.             writer.close();     
  43.         } catch (Exception e) {     
  44.             e.printStackTrace();     
  45.         }     
  46.     }     
  47.          
  48.     @Test    
  49.     public void testDom(){     
  50.         Document document = createDocument();     
  51.         try {     
  52.             FileOutputStream fos = new FileOutputStream("dom_"+FILE_NAME);     
  53.              // Use a Transformer for output     
  54.              TransformerFactory tFactory =     
  55.                 TransformerFactory.newInstance();     
  56.              Transformer transformer = tFactory.newTransformer();     
  57.              transformer.setOutputProperty("indent","yes");     
  58.              transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","4");     
  59.              transformer.setOutputProperty("encoding","UTF-8");     
  60.                   
  61.              DocumentSource source = new DocumentSource(document);     
  62.              StreamResult result = new StreamResult(fos);     
  63.              transformer.transform(source,result);     
  64.                   
  65.              fos.close();     
  66.         } catch (Exception e) {     
  67.             e.printStackTrace();     
  68.         }     
  69.     }     
  70.          
  71.     private Document createDocument(){     
  72.         Document document = null;     
  73.         try {     
  74.             File file = new File(FILE_NAME);     
  75.             BufferedReader reader = new BufferedReader(     
  76.                     new InputStreamReader(new FileInputStream(file)));     
  77.                  
  78.             StringBuffer buffer = new StringBuffer();     
  79.             String line = "";     
  80.             while((line = reader.readLine()) != null){     
  81.                 buffer.append(line);     
  82.             }     
  83.             reader.close();     
  84.                  
  85.             document = DocumentHelper.parseText(buffer.toString());     
  86.         } catch (Exception e) {     
  87.             e.printStackTrace();     
  88.         }     
  89.         return document;     
  90.     }     
  91. }  

 

下面是dom4j的转换后的输出:

Xml代码

  1. xml version="1.0" encoding="UTF-8"?>    
  2. <Package id="test" name="Test     
  3. Test">   Package> 

 

下面是transfomer的输出:

Xml代码

  1. xml version="1.0" encoding="UTF-8"?>    
  2. <Package id="test" name="Test Test">  Package> 

 

大家看到效果了把,dom4j变成了 \n, 但是transfomer还是原来的格式。

如果大家谁有对这块有研究的,希望给我留言解决这个问题。

【编辑推荐】

  1. JavaFX HTTP网络和XML分析
  2. 详解Java解析XML的四种方法
  3. XML新手入门 创建构造良好的XML
责任编辑:金贺 来源: ITEYE博客
相关推荐

2009-06-23 14:17:00

Dom4j

2012-05-30 10:03:57

dom4jXML乱码

2009-04-02 17:37:38

dom4jXMLJava

2013-05-30 15:02:33

dom4j反射

2024-07-22 08:16:15

2009-06-11 17:22:03

操作xml方式Java

2022-03-25 13:42:15

Log4j漏洞网络安全

2014-12-31 14:09:23

xml解析

2009-09-25 10:38:42

Hibernate动态

2009-08-19 22:29:12

VMWare系统时间故

2020-02-28 14:48:51

结构系统程序

2010-08-24 16:13:38

面试

2013-08-27 10:20:35

JavaLINQLinq4j

2021-07-12 22:39:15

JVM深度学习ETL

2011-04-11 09:53:06

Oracle

2024-01-29 09:22:59

死锁线程池服务

2018-08-01 10:40:04

Redis内存增长

2015-07-29 10:34:17

微信诡异

2016-10-21 13:10:18

javalog4jslf4j

2020-01-07 10:06:26

Slf4jLog4JLogback
点赞
收藏

51CTO技术栈公众号