2012-04-23 4 views
1

XMLファイルを作成しようとしています。次のコードを使用してドキュメントを作成することができました。この文書をインデントサポート付きのファイルに書きたいと思います。現在、私のコードは次のようになっています。Javaのファイルに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つのアプローチの違いは何ですか?そして、これらのテクニックのどれがより良いパフォーマンスを提供しますか?

+2

「より良いパフォーマンス」とは、「CPU時間がより少ない」ということですが、各メソッドでファイルを書き込む回数を100000回とし、消費時間を計算するのはなぜですか? – ZeroOne

+0

あなたはどのXMLSerializerを使用していますか?それはどのパッケージに属していますか? –

+0

私はxercesパーサーを使用しています - "com.sun.org.apache.xml.internal.serialize.XMLSerializer" – JourneyMan

答えて

0

あなたの質問に答えるために、私はW3Cが提案したDOM LoadとSave APIの3つ目の方法を提案します。コードは自己説明的です。先行標準より以下であるのXmlSerializer異なり

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

それは全て準拠実装によってサポートされているように、このアプローチが好ましいです。パフォーマンスはベンダーの実装に大きく依存します。

関連する問題