1

XMLファイルを書き込もうとしています。次のコードを使用してドキュメントを作成できました。このドキュメントをインデントをサポートするファイルに書き込みたいです。現在、私のコードは次のようになっています。

XMl を解析してファイルに書き込むためのより優れたテクノロジはどれですか。

public void writeXmlToFile(Document dom) throws IOException {
    OutputFormat format = new OutputFormat(dom);
    format.setIndenting(true);

    XMLSerializer serializer = new XMLSerializer ( new FileOutputStream(
                                 new File("sample.xml")), format);
    serializer.serialize(dom);
}

または、より良いアプローチでトランスフォーマーを使用しています。

public void writeXMLToFile(DOcument dom) throws TransformerException, IOException {
    TransformerFactory transFact = TransformerFactory.newInstance();
    Transformer        trans = transFact.newTransformer();

    trans.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    trans.setOutputProperty(OutputKeys.INDENT, "yes");
    trans.setOutputProeprty("{http://xml.apache.org/xslt}indent-amount", "2");

    StreamResult resut  = new StreamResult(new FileWriter(output));
    DOMSource source = new DOMSource(xmlDOC);

    trans.transform(source, result);
    writer.close();    
}

2つのアプローチの違いは何ですか? そして、これらの手法のどれがより良いパフォーマンスを提供しますか?

4

1 に答える 1

0

あなたの質問に答えるために、私はW3Cが提案したDOM Load andSaveAPIである3番目の方法を提案します。コードは自明です。

DOMImplementationLS ls = (DOMImplementationLS)
    DOMImplementationRegistry.newInstance().getDOMImplementation("LS");

// Gets a basic document from string.
LSInput input = ls.createLSInput();
String xml = "<bookstore city='shanghai'><a></a><b/></bookstore>";
InputStream istream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
input.setByteStream(istream);
LSParser parser = ls.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
Document document = parser.parse(input);

// Creates a LSSerializer object and saves to file.
LSSerializer serializer = ls.createLSSerializer();
serializer.getDomConfig().setParameter("format-pretty-print", true);
LSOutput output = ls.createLSOutput();
OutputStream ostream = new FileOutputStream("c:\\temp\\foo.xml");
output.setByteStream(ostream);        
serializer.write(document, output);

多かれ少なかれ先行標準であるXmlSerializerとは異なり、このアプローチは、すべての準拠実装でサポートされているため、推奨されます。ただし、パフォーマンスはベンダーの実装に大きく依存します。

于 2012-04-24T00:54:17.150 に答える