- PR -

XMLデータのファイルへの書き込み

1
投稿者投稿内容
おくちん
会議室デビュー日: 2003/08/29
投稿数: 11
投稿日時: 2003-12-10 15:53
はじめまして、おくちんと申します。

今、XindiceからXMLデータを取り出し、それをファイルへ書き込みをしたいと考えています。
そこで以下のような流れでファイルへ書き込もうとしています。

BufferedWriter out = new BufferedWriter(new FileWriter("D:/XML/result.xml"));

// データベースからドキュメントを取得
XMLResource document2 = (XMLResource) col.getResource(DocumentName);

//取得したドキュメントをDOMに変換
Document document3 = document2.getContentAsDOM().getOwnerDocument();

//ファイルへの出力
String CharacterCode = "Shift_JIS";
((XmlDocument)document3).write(out, CharacterCode);

このながれでファイルに書き出そうとすると
ClassCastException
がでてしまいました。

ここで行き詰まってしまい、自分ではどうしようもなくなったので書き込みをさせていただきました。
解決方法、または違ったやり方がありましたら、教えていただきたいです。
よろしくお願いします。

おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-12-10 16:21
JAXP準拠によるDOMオブジェクトのシリアライズですね。
これは、裏技的に「スタイルシートを指定せずにXSLT変換する」ことで実現します。
以下、Apache XML ProjectのXalan-J 2を想定します。

  • javax.xml.transform.TransformerFactoryを生成
  • javax.xml.transform.Transformerを生成
  • DOMオブジェクトからjavax.xml.transform.dom.DOMSourceを生成
  • 出力先のファイルからjava.io.FileOutputStreamを生成
  • java.io.FileOutputStreamからjavax.xml.transform.stream.StreamResultを生成
  • Transformer#trasnformのSourceにDOMSourceを、ResultにStreamResultを指定
  • FileOutputStream#close

こんな感じでしょうか。
詳細はXalan-J 2のAPI Docをご覧下さい。
ただ、使っているAPIはどれもJAXP準拠であり、Xalan-J 2非依存です。
おくちん
会議室デビュー日: 2003/08/29
投稿数: 11
投稿日時: 2003-12-10 17:45
おばけさん返答ありがとうございます。

教えていただいた通りに行ったところXML文書が

XML1.xml---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<root><tag>text</tag><kanji/><kanji/></root>
-----------------------------------------------
のようになり、ちょっと分かりにくいものとなりました。
これを

XML2.xml---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>text</tag>
<kanji/>
<kanji/>
</root>
-----------------------------------------------
のようにファイルに書き込むことはできないのでしょうか?

((XmlDocument)document3).write(out, CharacterCode);
を用いて出力させると、XML2.xmlのXML文書の形でファイルに書き込むことができるのですが、なにか良い方法はないでしょうか?
また
((XmlDocument)document3).write(out, CharacterCode);
を使える方法はないでしょうか?
よろしくお願いします。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-12-10 17:58
出力結果をインデントさせたいわけですね。
出来ますよ。
えっと、確かTransformerを生成する前に
コード:
TransformerFactory#setAttribute("indent", "yes")


を呼んでやればよかった気がします。

おくちん
会議室デビュー日: 2003/08/29
投稿数: 11
投稿日時: 2003-12-10 19:11
ファイルへの書き出し方に次のようなやり方があることを知り試したのですが、ファイルへの書き込みはやはり

XML1.xml---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<root><tag>text</tag><kanji/><kanji/></root>
-----------------------------------------------
のようになってしまいました。


// ファイルへの書き込み
BufferedWriter out = new BufferedWriter(new FileWriter("D:/XML/result.xml"));

/ ドキュメントを取得
XMLResource document = (XMLResource) col.getResource(DocumentName);

// 取得したドキュメントをDOMに変換
Document xmlDocument = document.getContentAsDOM().getOwnerDocument();

//シリアライズ
org.apache.xml.serialize.OutputFormat format = new org.apache.xml.serialize.OutputFormat("XML", "Shift_JIS", false);
format.setPreserveSpace(true);
org.apache.xml.serialize.XMLSerializer serializer = new org.apache.xml.serialize.XMLSerializer(out, format);

/ 取得したドキュメントを表示
serializer.serialize(xmlDocument);

XML2.xml---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <tag>text</tag>
 <kanji/>
 <kanji/>
</root>
-----------------------------------------------
XML2.xmlのようにファイルに書き込むことはできないのでしょうか?

おばけさん、ありがとうございます。
おばけさんに教えていただいた方法を用いてインデントさせた場合、
----------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>text</tag>
<kanji/>
<kanji/>
</root>
-----------------------------------------------
のようにファイルに書き込まれ、これを
XML2.xml---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <tag>text</tag>
 <kanji/>
 <kanji/>
</root>
-----------------------------------------------
のように親と子が同じ(空白が入るなどして)深さに出力されない方法はないのでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: おくちん 編集日時 2003-12-10 19:52 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-12-10 21:13
XML, pretty printerをキーワードにWeb検索すれば、その手のツールが見つかると思います。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2004-02-19 11:15
中込です。

引用:

//シリアライズ
org.apache.xml.serialize.OutputFormat format = new org.apache.xml.serialize.OutputFormat("XML", "Shift_JIS", false);



false ==> true

http://xml.apache.org/xerces2-j/javadocs/other/org/apache/xml/serialize/OutputFormat.html#OutputFormat(org.w3c.dom.Document,%20java.lang.String,%20boolean)
If indent is true, the document will be pretty printed with the default indentation level and default line wrapping.
1

スキルアップ/キャリアアップ(JOB@IT)