58

次の簡単なコードを使用します。

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

}

出力が得られます:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">

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

質問 A: ドキュメント コメントの後に doctype タグが表示されます。ドキュメントのコメントの前に表示することはできますか?

質問 B: JavaSE 5.0 API のみを使用してインデントを実現するにはどうすればよいですか? この質問は基本的にHow to pretty-print xml from javaと同じです、その質問のほとんどすべての回答は外部ライブラリに依存しています。JavaのAPIのみを使用する唯一の適用可能な回答(Lorenzo Boccacciaという名前のユーザーが投稿)は、基本的に上記のコードと同じですが、私にとっては機能しません(出力に示されているように、インデントはありません)。

外部ライブラリの回答の多くがそうであるように、インデントに使用するスペースの量を設定する必要があると推測していますが、Java APIでそれを指定する場所が見つかりません。インデント プロパティを "yes" に設定する可能性が Java API に存在するという事実を考えると、何らかの形でインデントを実行できるはずです。方法がわかりません。

4

4 に答える 4

118

欠けている部分はインデントする量です。インデントとインデント量は次のように設定できます。

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
于 2009-08-12T08:11:37.190 に答える
5

例として少しutilクラス...

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 は、Apache Foundationの xercesImpl によって提供されています。ここにmavenの依存関係があります:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
</dependency>

お気に入りのビルド ツールの依存関係は、http: //mvnrepository.com/artifact/xerces/xercesImpl/2.11.0にあります。

于 2011-02-27T11:58:38.873 に答える
1

おそらく、XSLT ファイルを使用してすべてをきれいにすることができます。Google はいくつかの結果を表示しますが、その正確性についてコメントすることはできません。

于 2009-08-12T10:39:12.247 に答える
0

出力を有効な XML ドキュメントにするには、いいえ。有効な XML ドキュメントは、処理命令で始まる必要があります。詳細については、XML 仕様http://www.w3.org/TR/REC-xml/#sec-prolog-dtdを参照してください。

于 2013-06-19T17:55:47.077 に答える