- - PR -
Node.getNodeValue(); から取得される値について。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-09-10 13:54
それらを実行することによって以下の値がしゅとくされます。
name:[c4] table:[t4] width:[9] seq:[1] search:[1] name:[c5] table:[t5] width:[90] seq:[2] search:[1] name:[c6] table:[t6] width:[90] seq:[3] search:[1] name:[c2] table:[t2] width:[90] seq:[4] search:[1] name:[c7] table:[t7] width:[90] seq:[5] search:[1] name:[c1] table:[t1] width:[90] seq:[6] search:[1] name:[c3] table:[t3] width:[90] seq:[9] search:[1] colmun "c4" だけ"90" ではなく"9" が取得されます。 xml のcolmun エレメントの順番を変えると4 番目のcolmun エレメントの値が壊れ、 colmun "c4" はちゃんと"90" が取得されます。 なおxml についてはデータ量が多いので多少削りましたが、動作は同じです。 | ||||
|
投稿日時: 2004-09-10 14:02
「値が取得されます」とありますが、ここはどのようにコーディングしているのですか?
ここが一番知りたかったところなんですが。 | ||||
|
投稿日時: 2004-09-10 14:15
transform した時点で値が壊れているのですが。。。
一様記述しますと、 java ソースに以下のものを追記してください。 // ルート要素を取得(タグ名:settings) Element settingsElem = doc.getDocumentElement(); // colmun要素のリストを取得 NodeList colmunNl = settingsElem.getElementsByTagName( "colmun" ); // colmun要素の数だけループ int loopNum = colmunNl.getLength(); for ( int cnt = 0; cnt < loopNum ; cnt++ ) { // colmun要素を取得 Element colmunElem = (Element)colmunNl.item( cnt ); // width要素のリストを取得 NodeList widthNl = colmunElem.getElementsByTagName( "width" ); // width要素を取得 Element widthElem = (Element)widthNl.item( 0 ); // width要素の最初の子ノード(テキストノード)の値を取得 結果 = widthElem.getFirstChild().getNodeValue(); System.out.println( "width: [" + 結果 + "]" ); } といったところです。 | ||||
|
投稿日時: 2004-09-10 15:34
こんにちは。
widthElemが持つ子要素の数を確認しましたか? テキストノードが分割されているのではないでしょうか? | ||||
|
投稿日時: 2004-09-10 16:08
けむ 様、お返事ありがとうございます!
おっしゃるとおりかもしれません。 子要素(というより子ノードですね)が分割されているような雰囲気です。 数の取得方法がわからなかったので断言できませんが、メモリを見ると分割されていました。 (子ノードの数を取得する方法はないのでしょうか? Element#getNextSibling() で次々と連結していくのが常套手段なのでしょうか? なぜこの項目だけ(colmun やtable はかなり長い文字列なのに)分割されるのでしょうか? 分割を回避する方法はないのでしょうか? 質問ばかりで申し訳ありませんが、ご存知の点がありましたらお教え頂けますでしょうか。 | ||||
|
投稿日時: 2004-09-10 16:35
とりあえず今回の問題はプログラムの方を変更することで解決しました。
widthElem を取得した後の処理を // width要素の最初の子ノード(テキストノード)の値から全ノードの値を連結 for ( Node n = widthElem.getFirstChild(); n != null; n = n.getNextSibling() ) { 結果 += n.getNodeValue(); } System.out.println( "width: [" + 結果 + "]" ); に変更しました。 が、上記の点は依然解決しておりません。 引き続きよろしくお願いいたします。 (特になぜこの値だけ子ノードが分割されるのか?について。 | ||||
|
投稿日時: 2004-09-10 16:40
るぱんです。
憶測ですが、 n.text()ってメソッドでとれません? 無かったかな・・・?汗 | ||||
|
投稿日時: 2004-09-10 17:15
るぱん さま、ご意見ありがとうございます!
Node#text() はありません。 が! ご意見を頂き調べていたところ発見しました、Node#nomalize()。
難しいことが書いてありますが、テキストノードの分離が行われなくなると。 これをtransform してDocument にキャストした直後にかませばよいわけです。 これで不安なくこの処理を使えます。 質問の回答は引き続きよろしくお願い致します。 |