改行を含むxmlファイルのノード取得についての問題

このQ&Aのポイント
  • JAXPを使ってxmlファイルのノードを取得する際、改行が正しく取得されない問題が発生しています。
  • 具体的には、<name>ノードの後に属性ノードであるtypeが来るはずですが、取得されません。
  • この問題について、解決方法を教えてください。
回答を見る
  • ベストアンサー

改行がノード?(JAXP)

xmlのノードについてですが、 <talkset> <name type="first">abc</name> <comment>hello!!</comment> </talkset> というxmlファイルがあった場合に、 JAXPでの、getNodeList()で全てのノードリストを 得ます(mynodelist=root.getNodeList())。 ここで、mynodelist.item(i)として、 上から、ノードを見ていくプログラムを作ったの ですが、 まず、最初にテキストノード(<talkset>の横の改行) 、次に<name>ノードがきて、次にテキストノード( </name>の横の改行?)が取り出されます。 この場合、本来、<name>ノードの後は属性ノードである type、次に、テキストノード(abc)そしてその後に、 改行(テキストノード)が取り出されるべきだと思う のですが、そうなりません(type属性と、abcが、 ノードとして、取り出せない)。 なにか分かる人、お願いします。

noname#10667
noname#10667
  • XML
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.1

質問を以下の2つと解釈します。 1)改行がノードとして取り出されるのは正しいのか/なぜか? 2)要素ノードnameの次に属性ノードtype,テキストノードabcが取り出せないのはなぜか? まず1ですが,改行がノードとして取り出されるのは,DOMの正しい仕様です。これがちゃんと取り出されないと,DOMからXMLに書き戻す時に改行が消去されてしまいます。 次に2についてですが,まずJAXPにもそのほかにもgetNodeList()というメソッドは見当たらなかったので,org.w3c.dom.Node.getChildNodes()のことと考えます。 要素ノード<talkset>でgetChildNodes()した時,NodeListの中に属性ノードtypeやテキストノード"abc"が出現しない理由は,それらが要素ノード<talkset>からみて子ノードではなく孫ノードに当るからです。 属性ノードtypeやテキストノード"abc"は,要素ノード<name>でgetChildNodes()して得られるNodeListの中から取り出すことができます。 参考: http://java.sun.com/j2se/1.4/ja/docs/ja/api/org/w3c/dom/class-use/NodeList.html http://java.sun.com/j2se/1.4/ja/docs/ja/api/org/w3c/dom/Node.html

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/org/w3c/dom/Node.html
noname#10667
質問者

お礼

ありがとうございます。 非常に参考になりました。 また勉強してみます。

関連するQ&A

  • MSXMLを使ってノードを削除したい。

    MSXML3.0で IXMLDOMDocumentPtr pXMLDOMDoc; pXMLDOMDoc.CreateInstance(__uuidof(DOMDocument)); pXMLDOMDoc->put_async(VARIANT_FALSE); pXMLDOMDoc->validateOnParse = FALSE; pXMLDOMDoc->load( _variant_t("XMLドキュメントのパス") ); としてXMLドキュメントを読み込み、属性が一致したノードを削除したいです。 例:xml <root> <category name='1'> <item> 車 </item> </category> <category name='1'> <item> バイク </item> </category> <category name='2'> <item> 自転車 </item> </category> <category name='2'> <item> 徒歩 </item> </category> </root> 上記のxmlからcategoryのname属性が1のものを削除し 下記のように変換したいです。 <root> <category name='2'> <item> 自転車 </item> </category> <category name='2'> <item> 徒歩 </item> </category> </root>

    • ベストアンサー
    • XML
  • .netのXmlDocumentを使ってテキストノードのタブや改行を無視する方法

    .NETのXmlDocumentオブジェクト等を使って、XMLファイルを読み込むプログラムを作っているのですが、 XmlNode.InnerTextでテキストノードの値を取得した場合、 タブや改行を含んだテキストが取得されてしまいます。 文字の部分だけを取得したいのですが、方法がわかりません。 ご存知の方が折られましたら、ご教示ください。 よろしくお願いいたします。 ---- <Example> (TAB)あいう(改行) </Example> とある場合、「あいう」だけ取得したいのですが、 「(TAB)あいう(改行)」と取得されてしまいます。

    • ベストアンサー
    • XML
  • xpath でn番目のテキストノード取得

    xpathで//text()とするとすべてのテキストノードが取得できますが、 この中からn番目のテキストノードを取得することは可能でしょうか? (プログラムでループではなく、xpathで。) <?xml version='1.0'?> <root><foo>aaa</foo><bar>bbb</bar><buz>bbb</buz></root> //text()[1]でaaaがとれるかと思ったんですが。。。 よろしくお願いします。

    • ベストアンサー
    • XML
  • XSLTで、あるノードの Text を別なノードの Name として参照

     変換したいXML文書の最初のトップレベルノードの階層をたどって text を拾っていくと、その text に一致する name のノードが次のトップレベルノードの階層で、出現するようになっています。  そこで、まず、最初のノードの階層をたどっていって、その順序で、2番目のノードから値を引いてきて表示させたいのです。 ■変換したい XML 文書 DataDocument.xml <datadocument> <setteischema> <sitem>solution <scategory>solution1</scategory> </sitem> <sitem>itsales <scategory>itsales1</scategory> </sitem> </setteischema> <setteivalue> <solution> <solution1>ソリューション1</solution1> </solution> <itsales> <itsales1>ITセールス1</itsales1> </itsales> </setteivalue> </datadocument> それに対して、適用したい XSL は次のようなものです。 ■変換命令を記述したXSL文書 StyleDocument.xsl <xsl:template match="setteischema" > <xsl:for-each select="*"> <xsl:variable name="foo" select="text()"/> <xsl:for-each select="*"> <xsl:variable name="bar" select="text()"/> <xsl:value-of select="★1" /> </xsl:for-each> </xsl:for-each> </xsl:template> 実際は★1の部分で setteivalue/$foo/$var といったパスで得られるノードのテキストを表示させたいのです。 どうしたらできますか? よろしくお願いします。

    • ベストアンサー
    • XML
  • flash、外部xml、サムネイル画像の改行について。

    XMLに記述されているサムネイル画像(複数)を帯状に横に等間隔に並べたいのです。 XMLは各ノードに画像名とサイズが属性として記述されており、 画像サイズは横幅は同じですが、高さがそれぞれ異なるので、単純に箱に入れるわけにはいかないようです。 そこで、 1.伸縮可能な箱を用意する。 2.XMLから、属性[高さ]を取得し、1の伸縮可能な箱に設定 3.2つめからは、箱のy座標を、足していく。 4.これを繰り返す。 5.指定の場所まで行ったら、改行する。 4までは以前の質問項目を参考にうまく行ったのですが、 5.「指定の場所まで行ったら、毎回改行する。」 というのが、うまくいきません。 誰かご指南いただけないでしょうか? Flashはcs3です。

  • TreeViewのノードの編集結果が反映されない

    C#3.5を使用しています。 treeView1にはnameが「ノード1」のノードがセットされていて、 それを次のようにして TreeNode newNode; newNode = new TreeNode(treeView1.SelectedNode.Name); newNode.Text = "ノードテキスト変更"; treeView1.SelectedNode = newNode; MessageBox.Show(treeView1.SelectedNode.Text);// ノード1のまま・・・ ノードを編集したと思ったのですがノードのテキストは変更されませんでした。 間に直接 treeView1.SelectedNode.Text = newNode.Text; を入れるとテキストは変更されるのですが、ノードそのものを入れ替える(編集する)には どのように記述すれば良いのでしょうか?

  • 要素のとりだしかた

    Jaxpのxmlパーサを使い、xmlからxmlに変換するプログラムを作っています。分からないことがあるのでぜひ教えてください。 例えば、 <book bookid="001"> <hon name="abc" /> <hon name="def" /> </book> <book bookid="002"> <hon name="ghi" /> </book> などというxmlからhonのnameがabcというものを探し、 あれば、"abc"とそのbookidの"001"を取り出す方法はどうすればいいでしょうか? abcは取り出せたのですが、それに対応するbookidが取り出せなくて困っています。 わかりづらくてすみません・・・。

    • 締切済み
    • XML
  • ある文字列を含むノードが存在するかを判定したい

    お世話になります。 次のようなXMLファイルがあります。 <root> <data> <code>1</code> <value>aiueo</value> </data> <data> <code>2</code> <value>kakikukeko</value> </data> <data> <code>3</code> <value>aiueo</value> </data> </root> 「aiueo」が一つでも含まれている<value>ノードが存在するならば、という判定をXSLファイルの中で行いたいです。 contains関数を使うのかなと思っているのですが、ルートノードから見て孫のノードを繰り返し探す処理が分からず困っています。 プログラムの前後の処理の都合上、ルートからの絶対パスで辿りたいのですが、方法を教えて下さいますでしょうか。 宜しくお願いします。

    • ベストアンサー
    • XML
  • JavaScriptのノードについて教えてください

    以下のコードなのですが追加されたテキストエリアにidをつけて保存する方法を教えてください それとテキストアリアを追加したときに横に並んで表示されるのですが 改行して表示するにはどうすればいいのでしょうか? <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <script src="plugins/plugin-loader.js"></script> <link rel="stylesheet" href="plugins/plugin-loader.css"> <script> // Set virtual screen width size to 320 pixels monaca.viewport({width: 320}); function addNode(){ <!--追加する子ノードを生成--> var kodomo = document.createElement("textarea"); <!--このノードのタグで囲まれている部分のテキストを設定--> kodomo.value = ""; <!--どこに追加するのか親ノードを指定--> var tuika = document.getElementsByTagName("div").item(1); <!--ここから子ノードを追加する命令--> tuika.appendChild(kodomo); } </script> </head> <body> <h1>テキストエリアの追加</h1> <!--初期は何もなし--> <div></div> <div><p>書き込んでください</p></div> <!--ボタン--> <button onClick="addNode();">追加</button> </body> </html> また追加ボタンを押したときに画面上部にテキストボックス、その下にテキストエリアを出す方法ってありますか?

  • ScalaでXMLファイルからノードを選択する.

    ScalaでXMLファイルから次のようなXPath式で表されるのノードを選択したくてサンプルプログラムを作ってみました. XPath式:"/musicLibrary/cd[string(year) = '1994']/title" [サンプルプログラム] import scala.xml.XML import scala.xml.Node import scala.xml.Elem object Main { def main(args: Array[String]): Unit = { val root:Elem = XML.loadFile("MusicLibrary.xml") val cds = ((root \\ "musicLibrary" \ "cd") .filter(p => p.asInstanceOf[Elem].child .filter(child => isElem(child) &&(child.asInstanceOf[Elem].label == "year")) .exists(year => year.text == "1994"))) val titles = cds \ "title" titles.foreach(title => println("The title='" + title.text + "'")) } def isElem(node:Node) ={ node match{ case e:Elem => true case _ => false } } } このプログラムで入力XMLファイル(MusicLibrary.xml)の以下が部分が選択され、 <?xml version="1.0" encoding="utf-8"?> <musicLibrary> ... <cd id="4"> <title>The Dark Side of the Moon</title> <year>1994</year> <artist>Pink Floyd</artist> <genre>Rock</genre> </cd> ... </musicLibrary> 一応 The title='The Dark Side of the Moon' とコンソール表示されます. しかし、まったくの初心者のプログラムのため val cds = 以下とval titles=以下は非常に冗長に感じられます. もっとシンプルに目的のノードを選択できるコーディングがありましたらご教授ください. 以上 よろしくお願いいたします.

専門家に質問してみよう