- PR -

XMLで特定の兄弟のノードの数を取り出したい(Rubyを使用)

1
投稿者投稿内容
ナレッジコミュニティ
会議室デビュー日: 2004/11/01
投稿数: 2
投稿日時: 2004-11-01 14:46
 はじめまして。大学の卒業研究でXMLを利用していたのですが,手詰まりとなってしまいましたので,皆様のご教授に預かりたい思い書き込みました。
 RubyでXMLを加工するプログラムを作っているのですが(Ruby1.6,DOM:XML Parser 0.6.8 http://www.yoshidam.net/Ruby_ja.html#xmlparser),次のようなことしたいと考えています。

<question_solution_tree>
 <node name="ハード・周辺機器"> ←
  <node name="ハード・パソコンパーツ">
   <category>ID-c0001</category>
   <category>ID-c0002</category>
  </node>
  <node name="周辺機器">
   <category>ID-c0007</category>
   <category>ID-c0008</category>
  </node>
  <category>ID-c0015</category>
 </node>
 <node name="オペレーティングシステム(OS)"> ←
  <category>ID-c0016</category>
  <category>ID-c0017</category>
 </node>
 <category>ID-c0019</category>
 <category>ID-c0020</category>
</question_solution_tree>

 このようなXMLがあり,矢印部1階層目のnodeの数(2つ)のみを調べたいと思い,
  @root.getElementsByTagName("node").length
で,nodeの数を取得したのですが,子孫すべてのnodeの数(4つ)を取得してしまいます。getElementByTagName()メソッドは指定したタグをオブジェクト内から全て抽出し、配列形式のコレクションに格納してしまうからです。子孫ではなく,兄弟の矢印の部分のnodeの数を取得するにはどのようにしたらよいのでしょうか。
 ご教授お願いいたします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-01 22:56
Rubyの版は古すぎませんか?1.8になってから1年ほど経過してます
やはり、XPathが使えるAPIじゃないと苦しいかと
(このモジュールの内容は見てませんが)
=========================================
Cygwin のものでも 1.8.1 2003−12−25 です

[ メッセージ編集済み 編集者: MMX 編集日時 2004-11-02 09:08 ]
bunbun
会議室デビュー日: 2002/08/15
投稿数: 12
投稿日時: 2004-11-01 23:36
Rubyのことはわからないのですが、DOMの仕様ではそういう動きが正しいです。

所望の動作をする直接的なメソッドは定義されていないはずです。

MMXさんから指摘があったように、XPathの使えるAPIでないと実現できないと思います。
ナレッジコミュニティ
会議室デビュー日: 2004/11/01
投稿数: 2
投稿日時: 2004-11-01 23:57
 回答ありがとうございます.確かに古いバージョンですが,使用できる環境のバージョンが現在こちらしかないので,使用しています.
 もしXPathでできるようであればどのような書き方ができますでしょうか.またREXMLを使用使用と考えたのですが命令が違いすぎると感じたので断念してしまいました.1.8で標準で使用でき,XML Parser 0.6.8 に近い命令のものであれば教えていただけないでしょうか.(makeを使わずにemergeでインストールできるようなもの)
 すいません.よろしくお願いいたします.
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-02 10:54
メモリ上にDOMを展開してオブジェクトDB風をするもアリですが
直接 ネイティブXML-DB をXQueryみたいな物で操作するほうが
今風かも。「オブジェクト・リレーショナル・マッピングは
コンピュータサイエンスのベトナムだ」とか噂もありますが。
Rubyの UTF-8 親和性はわかりませんが。

それはさておき。
Ruby de XML
http://www.ohmsha.co.jp/data/link/4-274-06500-6/index.htm
のサンプルには
−−−−−−−−−−−−−− xpath_speed.rb
File.open(filename) do |xml|
doc = REXML::Document.new(xml)
p xpath.match(doc, '//ref').size
end
で使えているようです,この場合なら
p xpath.match(doc, '/question_solution_tree/node').size
は 2 になるでしょう、たぶん

[ メッセージ編集済み 編集者: MMX 編集日時 2004-11-02 10:56 ]
1

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