image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ:ヤフーのジェリー・ヤンはスティーブ・ジョブズと何が違ったのか, Mac Ports の Ruby が遅かったのは修正されたみたい, etc... | トップページ | ピックアップ:漢字の軌範は教育産業がリードする, ミシュランガイド東京の致命的な欠陥, etc »

2008-11-24

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 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/43207954

この記事へのトラックバック一覧です: xml を別の xml 形式に変換するには?(その2):

« ピックアップ:ヤフーのジェリー・ヤンはスティーブ・ジョブズと何が違ったのか, Mac Ports の Ruby が遅かったのは修正されたみたい, etc... | トップページ | ピックアップ:漢字の軌範は教育産業がリードする, ミシュランガイド東京の致命的な欠陥, etc »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク