大家好。    问题是这样的:有一个xml文件(随便一个,手动编辑的都可以,不针对dom4j生成的xml文件),打开它,随便在某个属性值中敲入回车,完了用dom4j去解析这个xml文件,请问怎么才能读取属性的时候把这个回车也读出来,现在的现象是读进来回车就变成空格了。
    这个问题搜索了一段时间,是在没找到对策。去看源码也没看懂。
    Document doc = reader.read(new File("C:\\xxx.xml"));
    只知道执行这句后 doc 里面一层层点进去看到那个属性的时候属性值中的回车就已经成空格了。
    网上说在加载xml文件的时候‘\’是特别字符被转义了。
    
    难道真的是dom4j的bug?还是它就定死了就是不能读取回车?    如果不是,那有什么办法能解决这个问题呢?
    高手在哪里啊,求解啊。3Q。

解决方案 »

  1.   

    用SAX解析,应该不存在问题。
      

  2.   

    有这个才会保留空白字符 xml:space='preserve'
      

  3.   

    OutputFormat of = new OutputFormat("    ", true);  
            StringWriter sw = new StringWriter();  
            XMLWriter xmlwriter = new XMLWriter(sw,of);  
      

  4.   

    我这的dom4j读取换行符 是好使的呀。。不会发图片,要不就发个截图了
      

  5.   

    我晕  不能上传本地图片。
    那就这样吧: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>
      

  6.   


    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;
    }
      

  7.   


    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());
    }
    }
      

  8.   


    <?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>
      

  9.   

    可能是我表达的不清楚吧。
    我希望解析xml拿到后台打印或者查看是这样的(包含xml文件里面的换行):
    select
    *
    from
    dept t
    而不是(换行已经被空格替代了):
    select * from dept t
      

  10.   

    lz解决没?没解决加我qq好友:598048929
      

  11.   

    不太明白楼主的意思。按照我的理解,读出来后,再 string +  "\n",再打印   可不可以!
      

  12.   

    <?xml version="1.0" encoding="UTF-8"?>
    <metadata xml:space="preserve">
      <version>select
      *
      from dept t"</version>
    </metadata>
      

  13.   

    NND,实在不行,你写入xml之前先把所有换行替换成一个字符,读取的时候再替换回去。
      

  14.   

    既然你自己也说了是字符转义, 那用cdata把你的包起来试试
    <?xml version="1.0" encoding="UTF-8"?>
    <metadata version="<![CDATA[
    select
    *
    from
    dept t
    ]]>">
    </metadata>
      

  15.   

    看看dom4j的源代码就可以发现原因了
    还是用字符转义吧
      

  16.   

    parser error : Unescaped '<' not allowed in attributes values
      

  17.   

    在网上找到一个方法,要这样写xml便可保证读取后是换行的
    <?xml version="1.0" encoding="UTF-8"?>
    <metadata version="select&#10;*&#10;from&#10;dept&#10;t">
    </metadata>换行的地方使用“&#10;”来代替,这表示换行。
    因为dom4j是会给你转义的。
    参考文献:http://www.iteye.com/topic/1000639
      

  18.   

     要想得到attribute换行,有2中方案
    1、自定义特殊字符(这个不做解释了)
    2、修改源码
    由于attribute加入换行符不符合xml规定,dom4j也是引用apache的包,
    要想得到换行符,需要修改中部分源码把fAttributes.getValue 改成fAttributes.getNonNormalizedValue当然也可以重写代码!
      

  19.   

    结贴了总结下:    首先谢谢大家的热心帮助,特别是liyang1271989
        
        这个问题主要是需求不太好吧,属性解析到的换行会被替换掉,不光是dom4j,jdom也是,据liyang1271989说这个换行出现在属性里面是不符合xml规定的(有问题问他)。
        小弟最终只能写出xml的时候有属性里面有空格就替换成个特殊字符,完了读入的时候再替换回来(27楼简化了替换回来的过程)。
      

  20.   

     SAXReader reader = new SAXReader(); Document doc = reader.read(f);
    用这个读取试试,需要导入jaxen jar包
      

  21.   

    嘿嘿,这个问题我也碰到过,我的是在Text中要求读取回车换行\r\n 但是dom4j读取后就把\r除去了,很是纠结。用字符替换的方法对我不好,因为我不是读取后就立马写入,有其他地方要用xml文件中的内容!!
    难道这个真的没有办法了吗??