真的没有办法使用javax.xml.stream.XMLStreamWriter(Java SE 6)直接编写格式化的XML吗???这确实令人难以置信,因为其他XML API(例如JAXB和某些DOM库)能够做到这一点。甚至.NET XMLStreamWriter等效文件也可以使用此AFAIK(如果我没有记错的话,该类是System.Xml.XmlTextWriter)。

这意味着我唯一的选择是重新解析XML以生成格式化的输出?

例如。:

            StringWriter sw = new StringWriter();
    XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
    XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);
    writeXml(xmlStreamWriter);
    xmlStreamWriter.flush();
    xmlStreamWriter.close();

    TransformerFactory factory = TransformerFactory.newInstance();

    Transformer transformer = factory.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

    StringWriter formattedStringWriter = new StringWriter();
    transformer.transform(new StreamSource(new StringReader(sw.toString())), new StreamResult(formattedStringWriter));
    System.out.println(formattedStringWriter);

该解决方案的问题是属性“{http://xml.apache.org/xslt}缩进量”。我没有找到任何有关它的文档,并且似乎不能保证它是可移植的。

那么,如果我想对标准Java 6类执行此操作,我还有什么其他选择?创建JAXB或DOM对象图仅用于 pretty-print ?

最佳答案

您可以添加必要的代码以使用writeXml方法设置文档格式。只需维护一个深度计数器(以指示嵌套级别)即可。然后在writeStartElement之前和writeEndElement之后,使用深度索引插入一个缩进。

for(int x=0; x<depth; x++) {
    xmlStreamWriter.writeCharacters("    ");
}

07-25 23:22
查看更多