読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

REXMLを使ってRubyでXMLを読み込んだり、走査して要素を取り出す

Ruby
<スポンサーリンク>

XMLファイルを読み込んで、特定のタグの特定の値(text)を取り出したかった。
RubyXMLを解析するにはrexmlライブラリを使う。

このライブラリは標準ライブラリで、デフォルトで使うことができる。

今回読み込みたいXMLはこのようなものだ。

・pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>sample</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.3.3</version>
    </dependency>
  </dependencies>

</project>

このファイルを読み込んで、

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.3.3</version>
</dependency>

artifactIdが「httpclient」なものの、「version」の値を取り出したい。
そのためにはどうしたらいいか、というサンプルが以下のコードである。

require "rexml/document"

doc = REXML::Document.new(File.open("pom.xml"))

#"//"とすると、ルートエレメントから検索する。
doc.each_element("//project/dependencies") { |depes|

	#".//"だと、その要素の先頭から
	depes.each_element(".//dependency") { |dependency|

		puts dependency.elements["groupId"].text 
		#junitとorg.apache.httpcomponentsが表示される
		artifactId = dependency.elements["artifactId"].text
		if artifactId == "httpclient"
			puts dependency.elements["version"].text #4.3.3
		end
	}
}

出力される結果はコメントの通りで、「4.3.3」を取得することができた。

XMLをパースするにあたり、以下の記事に助けられた。英語だけど、検索でこの記事にたどり着いた人は読んでみたらいいかも。
https://www.ruby-forum.com/topic/155645

英語でGoogle検索

あと、調べ物をするときはだいたいGoogleで英語サイトの結果を検索しているんだけど、それは、以下のページから検索すればいい。
http://www.google.com/intl/en/

Rubyレシピブック 第3版 303の技

Rubyレシピブック 第3版 303の技