How to pretty print XML from Java?

后端 未结 30 2527
慢半拍i
慢半拍i 2020-11-22 01:55

I have a Java String that contains XML, with no line feeds or indentations. I would like to turn it into a String with nicely formatted XML. How do I do this?



        
30条回答
  •  梦毁少年i
    2020-11-22 02:30

    Just to note that top rated answer requires the use of xerces.

    If you don't want to add this external dependency then you can simply use the standard jdk libraries (which actually are built using xerces internally).

    N.B. There was a bug with jdk version 1.5 see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446 but it is resolved now.,

    (Note if an error occurs this will return the original text)

    package com.test;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.sax.SAXSource;
    import javax.xml.transform.sax.SAXTransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    
    import org.xml.sax.InputSource;
    
    public class XmlTest {
        public static void main(String[] args) {
            XmlTest t = new XmlTest();
            System.out.println(t.formatXml("text D"));
        }
    
        public String formatXml(String xml){
            try{
                Transformer serializer= SAXTransformerFactory.newInstance().newTransformer();
                serializer.setOutputProperty(OutputKeys.INDENT, "yes");
                //serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
                serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
                //serializer.setOutputProperty("{http://xml.customer.org/xslt}indent-amount", "2");
                Source xmlSource=new SAXSource(new InputSource(new ByteArrayInputStream(xml.getBytes())));
                StreamResult res =  new StreamResult(new ByteArrayOutputStream());            
                serializer.transform(xmlSource, res);
                return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
            }catch(Exception e){
                //TODO log error
                return xml;
            }
        }
    
    }
    

提交回复
热议问题