
こんばんわyukimura1024です。
javaでDOMを使ってXMLファイルを作成していますが、ノードを並び替える方法がわかりません。
例えば以下の例ようなXMLがあり、これをA→Bのように並び替えるといったものです。
いったん取り出して作り直せばよいのですが、階層が深いとコピーが大変ですよね。
(調べたところ深いコピーはなかったです)
これを簡単に実現するいい方法はないものでしょうか?
ご存知の方、教えていただけると助かります!よろしくお願いします。
例)
(A)
<PARENT>
<CHILD1/>
<CHILD2/>
<CHILD3/>
</PARENT>
(B)
<PARENT>
<CHILD3/>
<CHILD2/>
<CHILD1/>
</PARENT>
No.6ベストアンサー
- 回答日時:
#5>これがXSLTで簡単に変換できてしまうなら是非ご教示ください。
エラートラップを簡略していますが、こんな感じ。
XSL の部分はオンメモリということで文字列で持っていますが、
ファイルから取り込むのももちろん可。
----------------------------------------------------------------
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class Sample {
public static void main(String args[]) throws Exception{
String xsl=
//"<?xml version='1.0' encoding='Shift_JIS' ?>"+
"<xsl:stylesheet version='1.0' "+
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>"+
"<xsl:output method='xml' version='1.0' encoding='Shift_JIS' indent='yes' />"+
"<xsl:template match='/ROOT'>"+
"<xsl:element name='ROOT'>"+
"<xsl:apply-templates select='PARENT1' />"+
"<xsl:copy-of select='PARENT2' />"+ //そのまま
"<xsl:apply-templates select='PARENT3' />"+
"</xsl:element>"+
"</xsl:template>"+
"<xsl:template match='PARENT1'>"+
"<xsl:element name='PARENT1'>"+
"<xsl:copy-of select='CHILD_HEAD' />"+
"<xsl:copy-of select='CHILD_PROP' />"+
"<xsl:copy-of select='CHILD_END' />"+
"</xsl:element>"+
"</xsl:template>"+
"<xsl:template match='PARENT3'>"+
"<xsl:element name='PARENT3'>"+
"<xsl:copy-of select='CHILD_HEAD' />"+
"<xsl:copy-of select='CHILD_END' />"+
"<xsl:copy-of select='DETAILS_A' />"+
"</xsl:element>"+
"</xsl:template>"+
"</xsl:stylesheet>";
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfactory.newDocumentBuilder();
Document doc = builder.parse(new File("parent.xml"));//ファイルからDOMを作る、実際は作ってあるはずなのでこの部分は必要ない
DOMSource in = new DOMSource(doc);
StreamSource ss = new StreamSource(new StringReader(xsl));
StreamResult out = new StreamResult(new File("result.xml")); //ファイルに書き出す
TransformerFactory tff =
TransformerFactory.newInstance();
Transformer tf = tff.newTransformer(ss);
tf.transform(in,out);
}
}
この回答への補足
BLUEPIXYさん。おはようございます。
ここまでソースを書いていただいてありがとうございます。
早速実際に使ってみたいと思います。
のちほど結果報告しますね。
BLUEPIXYさんこんにちは!
何度も丁寧に回答していただきありがとうございました(^^
おかげで問題も解決しました。
XSLTは今まで使ったことがなかったので、大変勉強になりました。
No.5
- 回答日時:
>実際はそうではないです。
そうですか、また、具体的なコードを書かなくて良かったです。
次から次へと、あれは、(実際とは)違ってるとか言われると萎えるし・
#3(と#1)でできるということは、おわかりになったのでしょうか?
まさに、DOM(とか)を変換するというものですけど・
XSLTがわからないとどう書いていいのかわからんかもしれませんね。
#1を見て貰うと判るかもしれませんが、
マッチしたところを、こういう構成に変更するというのが基本的なテンプレートの書き方なので、直下のノードであろうがあるまいが、
ここで、これにマッチしたものをこれに置き換えるという記述ができます。
結局実際と違うということになってしまうので、質問で書かれた構成についてサンプル(XLST)を書いてもムダになってしまうので、
もし、問題がなければ、実際のこういう構成のものをこういう構成にしたいというものを補足してもらうのが簡単だと思います。
この回答への補足
BLUEPIXYさん、こんばんは。何度もすみません。
実際の構成はノード名は違いますが以下のものになります。
(変換前)
<ROOT>
<PARENT1>
<CHILD_PROP/>
<CHILD_END/>
<CHILD_HEAD/>
</PARENT1>
<PARENT2>
<CHILD_PROP/>
<CHILD_END/>
</PARENT2>
<PARENT3>
<CHILD_END/>
<DETAILS_A/>
<CHILD_HEAD/>
</PARENT3>
</ROOT>
(変換後)
<ROOT>
<PARENT1>
<CHILD_HEAD/>
<CHILD_PROP/>
<CHILD_END/>
</PARENT1>
<PARENT2>
<CHILD_PROP/>
<CHILD_END/>
</PARENT2>
<PARENT3>
<CHILD_HEAD/>
<CHILD_END/>
<DETAILS_A/>
</PARENT3>
</ROOT>
このようにROOT/PARENTxx/以下のノードを、CHILD_HEAD→CHILD_PROP→CHILD_ENDの順に並び替えたいというものです。
(注意点)
1.PARENTxx以下にHEAD,PROP,ENDと3つ揃っていない場合もある。
2.CHILD_xx以下にさらにノードがある場合もある。
うーん。これでうまく伝わるでしょうか。これがXSLTで簡単に変換できてしまうなら是非ご教示ください。よろしくお願いします。
No.4
- 回答日時:
ちょっと伺いたいのですが、
DOMツリーの中で、ルート直下のノードを入替てもあまり意味が無いような気がするのですが、
今回の目的というのは、XMLソースファイルを別の変換したXMLファイルにするということなのでしょうか?
この回答への補足
BLUEPIXYさんこんばんは(^^
例として書いたものはルート直下ですが、実際はそうではないです。そのへんは関係ないかなと思いシンプルな例を書いてしまいました。
今回この質問をした背景としましては以下の4点です。
1.JavaコードでXMLファイルを作成する
2.すでにロジックはほぼ完成している
3.順番は関係ない→やっぱりちゃんと順番を決めると仕様が変わった(泣
4.ロジックを変えるのが大変
というわけでいったん作ったDOMツリーを簡単に並び替えられる方法を探していました。
なので「XMLソースファイルを別の変換したXMLファイルにする」ということでほぼ合っていると思います。
※実際はXMLファイルを読み込んで変換するのではなく、何もないところから作ったDOMツリーをファイル出力する前にもう一度組み立てなおす、といった感じです。
No.3
- 回答日時:
No.2
- 回答日時:
#1です。
>今回はソートではなく任意の並び替えが目的です。
ノード名で降順にソートしたいのだと思っていました。
>XSLは使ったことがないのですが、JAVAコードで書けるものでしょうか?
TransformerFactory を使えば、XSLによる変換が可能です。
ソートとかしない単純な並び替えであれば、
XPath で指定したノードを xsl:copy-of を望む順番に置いて並び替えるだけなので、
静的なXSLでなくても、動的にXSLを作ることも簡単だと思います。
この回答への補足
BLUEPIXYさん回答ありがとうございます。
なるほど、動的に内部でXSLを作り出してそれを使うということですか。それなら外部にファイルを用意しなくても良いのでよさそうですね。
XSL自体まったく使ったことがなく、変換のやり方が想像できないのですが今回の問題でどこか参考になるサイトなどありますでしょうか。
実際のコードなど書いてあるととても助かります(^^;
No.1
- 回答日時:
下記のようなXSLを作成して、適用する
----------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="Shift_JIS" indent="yes" />
<xsl:template match="/PARENT">
<xsl:element name="PARENT">
<xsl:for-each select="*">
<xsl:sort select="name(.)" data-type="text" order="descending"/>
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
この回答への補足
すみません。XSLは使ったことがないのですが、JAVAコードで書けるものでしょうか?
それと今回はソートではなく任意の並び替えが目的です。
1,2,3と単純に書いたのでソートでOKっぽく見えてしまいますね。。。(^^;)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS PCサイズで赤い画像2つと、青い画像2つがそれぞれ横に2つずつ並んでいるのですが、これをスマホサイズ 5 2022/04/11 12:01
- 英語 「子供の頃の大好物」等の『「~の頃の」+名詞』の表現について 8 2022/04/28 11:36
- 英語 It is thanks to food and water that a child can gr 2 2022/04/12 19:57
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- その他(Microsoft Office) 逆順 3 2023/08/24 09:30
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
- 英語 分詞、形容詞的用法の完了形 9 2023/08/18 11:21
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- WordPress(ワードプレス) wordpress cocoon ヘッダーのフォント変換 2 2022/11/22 09:58
- Excel(エクセル) 【エクセル】並び替えからの並び替え方法 7 2022/07/22 09:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
XMLデータを動的に使用する
-
XSLでノードの順番取得
-
XMLから指定テキストのみを抜き...
-
東芝のDynabookなのですがアン...
-
新しいノード
-
XML同じ名前の要素を自動で集約...
-
エクセルVBAのFunctionプロシー...
-
メモリのセクションに関して
-
C#でTreeViewのCheckBoxのサイ...
-
Googleウェブマスターツール
-
ルート要素ノードが2個ある場合?
-
CTreeCtrlで、あるノード以下だ...
-
多分木のプログラミングについて
-
htmlファイルに記載するvbscrip...
-
VB6でXMLを処理するには
-
同じタグ名の項目取得
-
XPathで途中に名前空間が設定さ...
-
TOMCAT起動エラー
-
XMLとRDFの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タグの有無の判定
-
xmlのテキストにリンクを張りた...
-
XSLで、XMLの空タグを制御したい。
-
文字列の取得
-
XSLでXMLデータをタブ区切りデ...
-
スタイルシートを使用したXM...
-
htmlに変換されない
-
xml→htmlへの変換&ページ分割...
-
XML → table (XSLで)
-
XMLをXSLを使いHTMLに変換した...
-
XSLTで固定長データファイルを...
-
XSLT変換について
-
XSLスタイルシートを2つ当てる...
-
XSLT
-
XSLTで直下のテキストのみ取得...
-
XSL中の改行、タブを無効にした...
-
XSLTにてタグ名を取得する方法
-
ノードの並び替え
-
javascriptでのxsltの利用に関...
-
xml による表示のしかたについて
おすすめ情報