大家好。 问题是这样的:有一个xml文件(随便一个,手动编辑的都可以,不针对dom4j生成的xml文件),打开它,随便在某个属性值中敲入回车,完了用dom4j去解析这个xml文件,请问怎么才能读取属性的时候把这个回车也读出来,现在的现象是读进来回车就变成空格了。
这个问题搜索了一段时间,是在没找到对策。去看源码也没看懂。
Document doc = reader.read(new File("C:\\xxx.xml"));
只知道执行这句后 doc 里面一层层点进去看到那个属性的时候属性值中的回车就已经成空格了。
网上说在加载xml文件的时候‘\’是特别字符被转义了。
难道真的是dom4j的bug?还是它就定死了就是不能读取回车? 如果不是,那有什么办法能解决这个问题呢?
高手在哪里啊,求解啊。3Q。
这个问题搜索了一段时间,是在没找到对策。去看源码也没看懂。
Document doc = reader.read(new File("C:\\xxx.xml"));
只知道执行这句后 doc 里面一层层点进去看到那个属性的时候属性值中的回车就已经成空格了。
网上说在加载xml文件的时候‘\’是特别字符被转义了。
难道真的是dom4j的bug?还是它就定死了就是不能读取回车? 如果不是,那有什么办法能解决这个问题呢?
高手在哪里啊,求解啊。3Q。
StringWriter sw = new StringWriter();
XMLWriter xmlwriter = new XMLWriter(sw,of);
那就这样吧:Java代码:import java.io.File;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class TestXml { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Document doc = null;
SAXReader reader = new SAXReader();
//读取导入文件
try {
doc = reader.read(new File("C:\\dahai.xml"));
String asXML= doc.asXML();
System.out.println(asXML);
Element root = doc.getRootElement();
String version = root.attributeValue("version");
System.out.println();
System.out.println();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}xml:<?xml version="1.0" encoding="UTF-8"?>
<metadata version="select
*
from
dept t">
</metadata>
public String showAll(){
SAXReader reader = new SAXReader();
Document doc = null;
String s =request.getSession().getServletContext().getRealPath("");
File file = new File(s+"/WEB-INF/kq/kq_dakamoshi.xml");
try {
doc = reader.read(file);
Element root = doc.getRootElement();
root.accept(new MyVisitor());
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
public class MyVisitor extends VisitorSupport {
public void visit(Element element){
System.out.println("+"+element.getName());
System.out.println("+"+element.getText());
}
public void visit(Attribute attr){
System.out.println("-"+attr.getName());
System.out.println("-"+attr.getText());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<g_zhi name="g_zhi">1</g_zhi>
<moshi name="moshi1">
<zhi name="moshimingcheng" >打二次
卡</zhi>
<lie name="shezhi1">上午
上班</lie>
<lie name="shezhi2">下午上班</lie>
</moshi>
</xml-body>
我希望解析xml拿到后台打印或者查看是这样的(包含xml文件里面的换行):
select
*
from
dept t
而不是(换行已经被空格替代了):
select * from dept t
<metadata xml:space="preserve">
<version>select
*
from dept t"</version>
</metadata>
<?xml version="1.0" encoding="UTF-8"?>
<metadata version="<![CDATA[
select
*
from
dept t
]]>">
</metadata>
还是用字符转义吧
<?xml version="1.0" encoding="UTF-8"?>
<metadata version="select * from dept t">
</metadata>换行的地方使用“ ”来代替,这表示换行。
因为dom4j是会给你转义的。
参考文献:http://www.iteye.com/topic/1000639
1、自定义特殊字符(这个不做解释了)
2、修改源码
由于attribute加入换行符不符合xml规定,dom4j也是引用apache的包,
要想得到换行符,需要修改中部分源码把fAttributes.getValue 改成fAttributes.getNonNormalizedValue当然也可以重写代码!
这个问题主要是需求不太好吧,属性解析到的换行会被替换掉,不光是dom4j,jdom也是,据liyang1271989说这个换行出现在属性里面是不符合xml规定的(有问题问他)。
小弟最终只能写出xml的时候有属性里面有空格就替换成个特殊字符,完了读入的时候再替换回来(27楼简化了替换回来的过程)。
用这个读取试试,需要导入jaxen jar包
难道这个真的没有办法了吗??