QA@IT

REXML::Document の要素へのアクセスに使える属性と使えない属性がある。

2950 PV

アップルの決算短信のXBRLファイルを rexml/documentを使って解析を試みてるのですが、
特定の要素を探す時にキーとして使える属性と使えない属性があり、理由がわからず困っています。

具体的には以下の様なXMLに対して

<ix:nonfraction name="tse-ed-t:NetSales" contextref="PriorYearDuration_ConsolidatedMember_ResultMember" unitref="JPY" decimals="-6" scale="6" format="ixt:numdotdecimal">24,099</ix:nonfraction>

値を取得しようとすると

  doc = REXML::Document.new(text)
  doc.elements.each("//[@name='tse-ed-t:NetSales']"){ |e| p e.get_text } # 取得できる
  doc.elements.each("//[@contextref='PriorYearDuration_ConsolidatedMember_ResultMember']"){ |e| p e.get_text } # 取得できない
  doc.elements.each("//[@unitref='JPY']"){ |e| p e.get_text } # 取得できる

と取得できる属性とできない属性がでてきます。

この差はどこで生まれるのでしょうか?

回答

下記コードを実行してみたところ、期待通り動作 (3 回 "24,099" と表示) しました。

require "rexml/document"

# 名前空間 ix を定義するため、適当な要素に入れてます
text = <<-XML
<container xmlns:ix="http://example.com">
  <ix:nonfraction name="tse-ed-t:NetSales" contextref="PriorYearDuration_ConsolidatedMember_ResultMember" unitref="JPY" decimals="-6" scale="6" format="ixt:numdotdecimal">24,099</ix:nonfraction>
</container>
XML

doc = REXML::Document.new(text)
doc.elements.each("//[@name='tse-ed-t:NetSales']"){ |e| p e.get_text }
doc.elements.each("//[@contextref='PriorYearDuration_ConsolidatedMember_ResultMember']"){ |e| p e.get_text }
doc.elements.each("//[@unitref='JPY']"){ |e| p e.get_text }

typo などないか確認してみては。

確認した環境は下記の通りです。

  • Ruby 2.1.0p0
  • OSX 10.9.2
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。