Javaでフリーフォマット的なXMLをCSV形式に変換したいのですが
XMLの形式が固定ではない為、XSL等は使用できません。

DOMまたはSAXで処理を行おうと思っているのですが
出力したいCSVの形式がSQLを外部結合したような
くり返しを行いたいのですが、どのようにしたらいいでしょうか?

くり返しのくり返し等ロジックが思い浮かびません。
何かヒントでもいいのでお願いいたします。

例)
XML
----------------------------------------
<会社>
<事業部>
<事業部名>テスト1事業部</事業部名>
<部>
<部名>テスト1部</部名>
<課>
<課名>第1開発課1</課名>
<課名>第2開発課1</課名>
</課>
</部>
<部>
<部名>テスト2部</部名>
<課>
<課名>第1開発課2</課名>
<課名>第2開発課2</課名>
</課>
</部>
</事業部>
<概要>
<A>
<A1>テストA1</A1>
<A2>テストA2</A2>
</A>
</概要>
</会社>
----------------------------------------
欲しいCSVの結果
事業部名,部名,課名,A1,A2
テスト1事業部,テスト1部,第1開発課1,テストA1,テストA2
テスト1事業部,テスト1部,第2開発課1,テストA1,テストA2
テスト1事業部,テスト2部,第1開発課2,テストA1,テストA2
テスト1事業部,テスト2部,第2開発課2,テストA1,テストA2

このQ&Aに関連する最新のQ&A

A 回答 (1件)

完全フリーフォーマットなのよね。


そしたらベタにやっていくしかないわよ。

この場合なら
事業部のリスト
部のリスト
Aのリスト
の3つを用意して
あとは3つのループをネストする
これがスマートかしら。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

やっぱりベタな方法しかないですか。。。
もう少し考えて見ます。

お礼日時:2009/05/28 22:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QXMLからcsvへの変換

下記のXMLのフィールドの項目を
xslを使い、msxsl.exe経由で、csvへ変換をしたいのですが、
各field nameを抽出するのがうまくいきません。

copy condition=の箇所は必要ありません。

どなたかご教示のほど、お願いいたします。

■XML
<?xml version="1.0" encoding="UTF-8"?>
<exportData>
<Book id="id">
<field name="keywords"></field>
<field name="listName"></field>
<field name="publisher"></field>
<field name="publishDate"></field>
<field name="illustrators"></field>
<field name="isbn"></field>
<field name="length"></field>
<field name="id"></field>
<field name="series"></field>
<field name="authors"></field>
<field name="title"></field>
<field name="summary"></field>
<field name="format"></field>
<field name="genre"></field>
<field name="coverImage"></field>
<field name="List Price"></field>
<field name="URL"></field>
<field name="Current Value"></field>
<field name="isbn13"></field>
<copy condition="" dateAcquired="" location="Bookshelf" owner="" presentValue="" source="">
</copy>
</Book>


■xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/">keywords,listName,publisher,publishDate,illustrators,isbn,length,id,series,authors,title,summary,format,genre,coverImage,URL,CurrentValue,isbn13
<xsl:apply-templates select="//Book"/>
</xsl:template>

<xsl:template match="Book">
<xsl:call-template name="keywords"/>,<xsl:call-template name="listName"/>,<xsl:call-template name="publisher"/>,<xsl:call-template name="publishDate"/>,<xsl:call-template name="illustrators"/>,<xsl:call-template name="isbn"/>,<xsl:call-template name="length"/>,<xsl:call-template name="id"/>,<xsl:call-template name="series"/>,<xsl:call-template name="authors"/>,<xsl:call-template name="title"/>,<xsl:call-template name="summary"/>,<xsl:call-template name="format"/>,<xsl:call-template name="genre"/>,<xsl:call-template name="coverImage"/>,<xsl:call-template name="URL"/>,<xsl:call-template name="CurrentValue"/>,<xsl:call-template name="isbn13"/><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>

よろしくお願いいたします。

下記のXMLのフィールドの項目を
xslを使い、msxsl.exe経由で、csvへ変換をしたいのですが、
各field nameを抽出するのがうまくいきません。

copy condition=の箇所は必要ありません。

どなたかご教示のほど、お願いいたします。

■XML
<?xml version="1.0" encoding="UTF-8"?>
<exportData>
<Book id="id">
<field name="keywords"></field>
<field name="listName"></field>
<field name="publisher"></field>
<field name="publishDate"></field>
<field name="illustrators"></field>
...続きを読む

Aベストアンサー

わかってしまえば、なんてことないんだけど、

ポイントは、値が必要な field 要素の一つ上の要素(Book)から、相対パスで field 要素を指定するところで、このとき select の条件に name 属性の条件も含めればいいだけ。


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/">
  <!-- 省略 -->
  <xsl:apply-templates select="//Book" />
</xsl:template>

<!-- csv のレコードを出力する処理 -->
<xsl:template match="Book">
<xsl:value-of select="field[@name='keywords']"/>,<xsl:value-of select="field[@name='listName']"/>,<xsl:value-of select="field[@name='publisher']"/>,...(省略)..,<xsl:value-of select="field[@name='isbn13']"/><xsl:text>
</xsl:text>
</xsl:template>

</xsl:stylesheet>

わかってしまえば、なんてことないんだけど、

ポイントは、値が必要な field 要素の一つ上の要素(Book)から、相対パスで field 要素を指定するところで、このとき select の条件に name 属性の条件も含めればいいだけ。


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/">
  <!-- 省略 -->
  <xsl:apply-templates select="//Book" />
</xsl:template>

<!-- ...続きを読む

QDOSコマンドラインからxmlファイル整形したい

こんにちは。

Windows のコマンドライン(正確にはバッチファイルで)、指定した xml ファイルを整形する方法を探しています。

整形方法は適当でよいですし、検証機能はなくても構いません(あっても別にいいです)。
現状、XMLがまったくの改行なしでベタ打ちされているので、多少は整形しないと、というレベルです。後々のファイル処理がややこしくならないように。

簡単に準備できるもの、コマンドもシンプルで、オプションなども複雑でないものがいいのですが、なにかいいプログラムなどご存じでしたら教えてください。XMLファイルは最大で10MBくらいあるかもしれません。

Aベストアンサー

定番ですが HTML Tidy とか。名前は HTML だけど XML にも対応してます。

実行してみましょう。これが元のファイルの sample.xml。改行無し。

 <?xml version="1.0" encoding="utf-8" ?><friends><person><name>松田松男</name><nickname>まっちゃん</nickname><tel>0123-45-6789</tel></person><person><name>高野高雄</name><nickname>タカさん</nickname><tel>9876-54-3210</tel></person></friends>

tidy で整形するとこんな感じ。

 $ tidy -utf8 -xml -i -q sample.xml
 <?xml version="1.0" encoding="utf-8"?>
 <friends>
 <person>
 <name>松田松男</name>
 <nickname>まっちゃん</nickname>
 <tel>0123-45-6789</tel>
 </person>
 <person>
 <name>高野高雄</name>
 <nickname>タカさん</nickname>
 <tel>9876-54-3210</tel>
 </person>
 </friends>

これは Linux で実行したけど、Windows 版もあります。

説明は次のページがわかりやすいかな。

http://d.hatena.ne.jp/takuya_1st/20110830/1314704820

下のページが本家。

http://tidy.sourceforge.net/

定番ですが HTML Tidy とか。名前は HTML だけど XML にも対応してます。

実行してみましょう。これが元のファイルの sample.xml。改行無し。

 <?xml version="1.0" encoding="utf-8" ?><friends><person><name>松田松男</name><nickname>まっちゃん</nickname><tel>0123-45-6789</tel></person><person><name>高野高雄</name><nickname>タカさん</nickname><tel>9876-54-3210</tel></person></friends>

tidy で整形するとこんな感じ。

 $ tidy -utf8 -xml -i -q sample.xml
 <?xml version="1.0" encoding...続きを読む


人気Q&Aランキング

おすすめ情報