03

17

[Ruby] Nokogiri メモ

2011.03.17(20:47)

XML,HTMLパーサーのNokogiriのメモ。
http://nokogiri.rubyforge.org/nokogiri/Nokogiri.html

プログラムと実行結果があれば解説がいらない人のためのメモ。


インストール
gem update --system --http-proxy http://10.1.2.3:8080
gem install nokogiri --http-proxy http://10.1.2.3:8080

入力
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygenindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="index.xsd" version="1.7.3">
 <compound refid="classpackage_1_1_c_base" kind="class">
  <name>package::CBase</name>
  <member refid="classpackage_1_1_c_base_1acaf1dfd0888e64bb5a802bc7a49a7426" kind="function">
   <name>CBase</name>
  </member>
  <member refid="classpackage_1_1_c_base_1a60149cc72d67f91c12f9f445c97ce603" kind="function">
   <name>~CBase</name>
  </member>
 </compound>
 <compound refid="_hello_8cpp" kind="file">
  <name>Hello.cpp</name>
  <member refid="_hello_8cpp_1a3c04138a5bfe5d72780bb7e82a18e627" kind="function">
   <name>main</name>
  </member>
 </compound>
 <compound refid="dir_c8327ca8a273b59d8243e4c2b095e0ec" kind="dir">
  <name>source/</name>
 </compound>
</doxygenindex>

プログラム
#!/usr/bin/ruby -Ku
require "rubygems"
require "nokogiri"

fname = '.\index.xml'
f = File.open(fname)
doc = Nokogiri::XML(f)

p doc.class
p doc.xpath("//compound[@kind='class']").size

p doc.xpath("//compound").class
p doc.xpath("//compound").size

p doc.xpath("//compound")[0].class
p doc.xpath("//compound")[0]["refid"]
p doc.xpath("//compound")[0]["refid"].class
p doc.xpath("//compound")[0]["kind"]
p doc.xpath("//compound")[0].xpath(".//name").class
p doc.xpath("//compound")[0].xpath(".//name").size
p doc.xpath("//compound")[0].xpath(".//name")[0].text
p doc.xpath("//compound")[0].xpath(".//member").size
p doc.xpath("//compound")[0].xpath(".//member")[0]["kind"]
p doc.xpath("//compound")[0].xpath(".//member")[0].xpath(".//name")[0].text

p '-'*40
doc.xpath("//compound").each { |elem|
print elem["refid"] ," ",elem["kind"],"\n"
print elem.xpath(".//name")[0].text,"\n"
elem.xpath(".//member").each { |elem2|
print " ",elem2["refid"]," ",elem2["kind"],"\n"
print " ",elem2.xpath(".//name")[0].text,"\n"
}
}

出力
Nokogiri::XML::Document
1
Nokogiri::XML::NodeSet
3
Nokogiri::XML::Element
"classpackage_1_1_c_base"
String
"class"
Nokogiri::XML::NodeSet
3
"package::CBase"
2
"function"
"CBase"
"----------------------------------------"
classpackage_1_1_c_base class
package::CBase
classpackage_1_1_c_base_1acaf1dfd0888e64bb5a802bc7a49a7426 function
CBase
classpackage_1_1_c_base_1a60149cc72d67f91c12f9f445c97ce603 function
~CBase
_hello_8cpp file
Hello.cpp
_hello_8cpp_1a3c04138a5bfe5d72780bb7e82a18e627 function
main
dir_c8327ca8a273b59d8243e4c2b095e0ec dir
source/



コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示