xml を別の xml 形式に変換するには?(その2)
汎用的なものはみつけられず。
ともかく、XBRL インスタンスの書き換え専用の ruby スクリプトを書いてみた。
$ cat toSimpleXbrl.rb
# 2008-11-23 katoy
# XBRL インスタンスの 科目タグを書き換える。
# <foo:bar ...> <==> <item prefix='foo' local_name='bar' ...>
#
require 'rubygems'
require "rexml/document"
require 'open-uri'
require 'pp'
#----------------------
class XBRL
def self.to_simple(doc)
doc.elements.each do |elem|
elem.elements.each do |c|
to_simple_tree(c)
end
end
end
def self.to_simple_tree elem
prefix = elem.prefix
return if prefix == 'xlink' or prefix == 'link'
name = elem.name
return if name == "context" or name == "unit"
to_simple_element(elem)
elem.elements.each do |e|
name = e.name
to_simple_tree(e)
end
end
def self.to_simple_element elem
type = elem.node_type
if type != :comment and type != :text
name = elem.name
elem.add_attributes( { 'prefix' => elem.prefix, 'local_name' => elem.local_name } )
elem.name = :item
end
end
#----------------------
def self.to_xbrl(doc)
doc.elements.each do |elem|
elem.elements.each do |c|
to_xbrl_tree(c)
end
end
end
def self.to_xbrl_tree elem
to_xbrl_element(elem)
elem.elements.each do |e|
to_xbrl_tree(e)
end
end
def self.to_xbrl_element elem
type = elem.node_type
if type != :comment and type != :text
if elem.name == nil # c.name == 'item' ではひかっからない、何故?
elem.name = "#{elem.attribute('prefix')}:#{elem.attribute('local_name')}"
elem.delete_attribute("prefix")
elem.delete_attribute("local_name")
end
end
end
end
def execute doc
org_xml = doc.to_s
XBRL::to_simple(doc)
simple_xml = doc.to_s
XBRL::to_xbrl(doc)
xbrl_xml = doc.to_s
# puts f
if org_xml != xbrl_xml or simple_xml == xbrl_xml
puts "--- Error #{f} ------"
doc.write( File.new('1.org.xml', 'w'))
File.new('1.simple.xml', 'w').write simple_xml
File.new('1.xbrl.xml', 'w').write xbrl_xml
exit
end
temp = REXML::Document.new simple_xml
temp.write( File.new('1.simple.xml', 'w'), 4 )
temp = REXML::Document.new org_xml
temp.write( File.new('1.org.xml', 'w'), 4 )
end
# local file
pat = "/Users/youichikato/work/www/xbrl.org/XBRL-CONF/**/*.xbrl"
# pat = "397-00-ConsistentInstance-valid.xbrl"
# SEC - adobe
# pat = "http://www.sec.gov/Archives/edgar/data/796343/000079634308000007/adbe-20080916.xml"
count = 0
if pat.index('http:') == 0
uri = URI.parse(pat)
doc = REXML::Document.new uri.read
execute doc
count += 1
else
Dir.glob(pat).each do |f|
doc = REXML::Document.new File.open(f)
execute doc
count += 1
end
end
puts "-- Checked #{count} files in #{pat}"
$ ruby toSimpleXbrl.rb
-- Checked 69 files in /Users/youichikato/work/www/xbrl.org/XBRL-CONF/**/*.xbrl
念のために実行後に 1.org.xml (変換前の XBRL), 1.simple.xml(変換後の XBRL)を出力している。
$ diff 1*
21c21
< <tx:A decimals='0' contextRef='ctx0' unitRef='u1'>
---
> <item local_name='A' prefix='tx' decimals='0' contextRef='ctx0' unitRef='u1'>
23,24c23,24
< </tx:A>
< <tx:B decimals='0' contextRef='ctx0' unitRef='u1'>
---
> </item>
> <item local_name='B' prefix='tx' decimals='0' contextRef='ctx0' unitRef='u1'>
26,27c26,27
< </tx:B>
< <tx:C decimals='0' contextRef='ctx0' unitRef='u1'>
---
> </item>
> <item local_name='C' prefix='tx' decimals='0' contextRef='ctx0' unitRef='u1'>
29,30c29,30
< </tx:C>
< <tx:D decimals='0' contextRef='ctx0' unitRef='u1'>
---
> </item>
> <item local_name='D' prefix='tx' decimals='0' contextRef='ctx0' unitRef='u1'>
32c32
< </tx:D>
---
> </item>
ローカルファイルだけでなく、SEC サイトのデータも扱える。
// 今は、ソース中の pat で、処理対象ファイルを指定するので、適宜 編集すること。
$ time ruby toSimpleXbrl.rb
-- Checked 69 files in /Users/youichikato/work/www/xbrl.org/XBRL-CONF/**/*.xbrl
real 0m1.131s
user 0m1.030s
sys 0m0.088s
$ time ruby toSimpleXbrl.rb
-- Checked 1 files in http://www.sec.gov/Archives/edgar/data/796343/000079634308000007/adbe-20080916.xml
real 0m5.754s
user 0m3.301s
sys 0m0.250s
« ピックアップ:ヤフーのジェリー・ヤンはスティーブ・ジョブズと何が違ったのか, Mac Ports の Ruby が遅かったのは修正されたみたい, etc... | トップページ | ピックアップ:漢字の軌範は教育産業がリードする, ミシュランガイド東京の致命的な欠陥, etc »
この記事へのコメントは終了しました。
« ピックアップ:ヤフーのジェリー・ヤンはスティーブ・ジョブズと何が違ったのか, Mac Ports の Ruby が遅かったのは修正されたみたい, etc... | トップページ | ピックアップ:漢字の軌範は教育産業がリードする, ミシュランガイド東京の致命的な欠陥, etc »
コメント