带有注释块的Java XML Pretty Print

时间:2015-04-05 04:45:35

标签: pretty-print transformer

我有以下代码来打印给定的XML。

public void prettyPrintXML(String xmlString) {
        try {
            Source xmlInput = new StreamSource(new StringReader(xmlString));
            StringWriter stringWriter = new StringWriter();
            StreamResult xmlOutput = new StreamResult(stringWriter);
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            transformer.transform(xmlInput, xmlOutput);
            System.out.println("OutPutXML : ");
            System.out.println(xmlOutput.getWriter().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

以下是上述代码的输入和输出:

InputXML :
<employees><employee><name>John</name><age>18</age></employee><!--employee><name>Smith</name><age>27</age></employee--></employees>

OutPutXML : 
<?xml version="1.0" encoding="UTF-8"?>
<employees>
    <employee>
        <name>John</name>
        <age>18</age>
    </employee>
    <!--employee><name>Smith</name><age>27</age></employee-->
</employees>

我需要以上面的格式

获取上面输出中的注释块
<!--employee>
   <name>Smith</name>
   <age>27</age>
</employee-->

有没有办法在不使用任何外部库的情况下在Java中执行此操作?

1 个答案:

答案 0 :(得分:1)

不,使用标准库不支持开箱即用。获得这种行为需要大量调整;将注释解析为XML并从父节点继承缩进级别。您还可能会将包含纯文本的注释与包含XML的注释混合在一起。

然而,我已经实现了这样一个处理器:xmlformatter。它还处理文本和CDATA节点中的XML,并且可以稳健地执行(即不会在注释中的无效XML上失败)。

<parent><child><!--<comment><xml/></comment>--></child></parent>

你会得到

<parent>
    <child>
        <!--
        <comment>
            <xml/>
        </comment>-->
    </child>
</parent>

我认为它比你想要的输出更具可读性。