首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅使用标准java api (缩进和文档类型定位)即可从javax.xml.transform.Transformer输出漂亮的打印结果

仅使用标准java api (缩进和文档类型定位)即可从javax.xml.transform.Transformer输出漂亮的打印结果
EN

Stack Overflow用户
提问于 2009-08-12 08:04:04
回答 4查看 85.5K关注 0票数 58

使用以下简单代码:

代码语言:javascript
复制
package test;

import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class TestOutputKeys {
    public static void main(String[] args) throws TransformerException {

        // Instantiate transformer input
        Source xmlInput = new StreamSource(new StringReader(
                "<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
        StreamResult xmlOutput = new StreamResult(new StringWriter());

        // Configure transformer
        Transformer transformer = TransformerFactory.newInstance()
                .newTransformer(); // An identity transformer
        transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(xmlInput, xmlOutput);

        System.out.println(xmlOutput.getWriter().toString());
    }

}

我得到了输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">

<aaa>
<bbb/>
<ccc/>
</aaa>

问题A: doctype标签出现在文档注释之后。有没有可能让它出现在文档注释之前?

问题B:如何仅使用JavaSE 5.0API实现缩进?这个问题在本质上与How to pretty-print xml from java是相同的,但是这个问题中的几乎所有答案都依赖于外部库。唯一适用的答案(由名为Lorenzo Boccaccia的用户发布),它只使用java的api,基本上与上面发布的代码相同,但对我不起作用(如输出所示,我没有得到缩进)。

我猜您必须设置用于缩进的空格量,就像许多外部库所做的那样,但我就是找不到在java api中在哪里指定它。假设在java api中存在将缩进属性设置为"yes“的可能性,则必须能够以某种方式执行缩进。我就是想不通是怎么回事。

EN

回答 4

Stack Overflow用户

发布于 2009-08-12 08:11:37

缺少的部分是要缩进的数量。可以设置缩进和缩进量,如下所示:

代码语言:javascript
复制
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
票数 118
EN

Stack Overflow用户

发布于 2011-02-27 19:58:39

以一个小的util类为例。

代码语言:javascript
复制
import org.apache.xml.serialize.XMLSerializer;

public class XmlUtil {

public static Document file2Document(File file) throws Exception {
    if (file == null || !file.exists()) {
        throw new IllegalArgumentException("File must exist![" + file == null ? "NULL"
                : ("Could not be found: " + file.getAbsolutePath()) + "]");
    }
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    dbFactory.setNamespaceAware(true);
    return dbFactory.newDocumentBuilder().parse(new FileInputStream(file));
}

public static Document string2Document(String xml) throws Exception {
    InputSource src = new InputSource(new StringReader(xml));
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    dbFactory.setNamespaceAware(true);
    return dbFactory.newDocumentBuilder().parse(src);
}

public static OutputFormat getPrettyPrintFormat() {
    OutputFormat format = new OutputFormat();
    format.setLineWidth(120);
    format.setIndenting(true);
    format.setIndent(2);
    format.setEncoding("UTF-8");
    return format;
}

public static String document2String(Document doc, OutputFormat format) throws Exception {
    StringWriter stringOut = new StringWriter();
    XMLSerializer serial = new XMLSerializer(stringOut, format);
    serial.serialize(doc);
    return stringOut.toString();
}

public static String document2String(Document doc) throws Exception {
    return XmlUtil.document2String(doc, XmlUtil.getPrettyPrintFormat());
}

public static void document2File(Document doc, File file) throws Exception {
    XmlUtil.document2String(doc, XmlUtil.getPrettyPrintFormat());
}

public static void document2File(Document doc, File file, OutputFormat format) throws Exception {
    XMLSerializer serializer = new XMLSerializer(new FileOutputStream(file), format);
    serializer.serialize(doc);
}
}

XMLserializer由xercesImpl从Apache Foundation提供。下面是maven依赖项:

代码语言:javascript
复制
<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
</dependency>

你可以在这里找到你最喜欢的构建工具的依赖项:http://mvnrepository.com/artifact/xerces/xercesImpl/2.11.0

票数 5
EN

Stack Overflow用户

发布于 2009-08-12 10:39:12

你也许可以用一个XSLT file来美化一切。谷歌给出了一些结果,但我不能对其正确性发表评论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1264849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档