- PR -

XMLの属性値をタグ名に置き換える

1
投稿者投稿内容
toto
会議室デビュー日: 2004/05/30
投稿数: 3
投稿日時: 2004-10-05 18:50
こんにちわ

下記のabc.xmlを読み込み属性値をタグ名に置き換えてxyz.xmlのように
出力するする事は可能でしょうか?javaでプログラムを作ろうと考えています。

abc.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a key="aaa">
<b key="bbb">
<value>txt</value>
</b>
<c key="ccc">
<value />
</c>
</a>
</root>


xyz.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<aaa>
<bbb>
<value>txt</value>
</bbb>
<ccc>
<value />
</ccc>
</aaa>
</root>
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-10-05 23:38
abc.xml をXMLとして読み込んで、xyz.xml と作るの二段階でできます
制約は 属性値が 要素の名前 に違反しないことだけです。

sed スクリプトでは

s%<a key="aaa">%<aaa>%
s%</a>%</aaa>%
s%<b key="bbb">%<bbb>%
s%</b>%</bbb>%
s%<c key="ccc">%<ccc>%
s%</c>%</ccc>%
===========================
要素名の変更 DOM
の2句 で検索すると、即出ます
http://livedocs.allaire.com/coldfusion/6.1_jp/htmldocs2/xml31.htm
要素名の変更

XML DOM は、要素名の変更を直接サポートしていません。要素の名前を変更するには、新しい名前の新規要素を作成し、XML ドキュメントオブジェクト内で元の要素の前または後ろに挿入します。次に、元の要素の内容をすべて新規要素にコピーし、元の要素を削除します。


[ メッセージ編集済み 編集者: MMX 編集日時 2004-10-06 09:58 ]
toto
会議室デビュー日: 2004/05/30
投稿数: 3
投稿日時: 2004-10-06 00:22
MMXさん返答有難う御座います。

可能でしたらdomを使用して実現したいと考えています。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/plugin/dom/

xmlを読込みxmlを作成したのですがうまくいきませんでした。
明日、再度挑戦はしてみます。
バクシ
会議室デビュー日: 2004/10/06
投稿数: 12
投稿日時: 2004-10-06 11:30
DOMを使うのも一手ですが,XSLTだと簡単です。
属性の名前や値がどのようなものでも,お望みの変換をおこないます。

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="*[@*]">
<xsl:element name="{@*}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>


[ メッセージ編集済み 編集者: バクシ 編集日時 2004-10-06 11:35 ]
toto
会議室デビュー日: 2004/05/30
投稿数: 3
投稿日時: 2004-10-06 15:00
バクシさん、返答有難うございます。

XSLTは詳しくはないのですが簡単に出来るようでしたら
試してみます。

制御の方はJavaで行いたい(指定読込ファイル、指定ディレクトリに作成)
と考えています。

早速試してみます。
ちなみにDOMの方はできそうで出来ない感じで悪戦苦闘していました。

バクシ
会議室デビュー日: 2004/10/06
投稿数: 12
投稿日時: 2004-10-06 15:56
JavaでDOMのDocumentとTemplatesのインスタンスを作り,

Transformer transformer = style.newTransformer();
transformer.transform(source, result);

ただし,styleがTemplatesのインスタンス

とすれば,XSLTスタイルシートを適用した変換結果を得ることができますね。ファイル操作は釈迦に説法,止めておきます。サンプルもあちこちにあるでしょう。


DOMを直接に操作する場合も,処理のロジックはXSLTのばあいと同じはず。

ルートからはじめてツリーをたどり,子ノードにルーチンAを適用(最初のtemplateに対応)

ルーチンA{
  その子ノードが

   属性をもつ要素ならば (二つ目のtemplateに対応)
    →属性値を名前とする要素を作成し,そのノードの前に挿入
    →要素の内容を子ツリーごとコピーしたものを
     あらたな要素のなかにコピー
    →元の要素を削除
    →新たな要素の子ツリーにたいし
     ルーチンAを再帰的に適用

   属性をもたないノードならば  (三つ目のtemplateに対応)
    →子ツリーにたいしルーチンAを再帰的に適用

   子ノードがない →ルーチンAを抜ける


ちなみに,XSLTスタイルシートでは,最初のtemplateは省略可能です。

つまり,下記のように短くすることができます。こんなに簡単なもので,変換ができてしまうのは,不思議といえば不思議。DOMだけで変換しようとすると,ずいぶん長いプログラムになるでしょう。それは避けたいというのが本音です。

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

<xsl:template match="*[@*]">
<xsl:element name="{@*}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>


[ メッセージ編集済み 編集者: バクシ 編集日時 2004-10-06 16:09 ]

[ メッセージ編集済み 編集者: バクシ 編集日時 2004-10-06 16:11 ]
1

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