XML

XML ファイルの読み書き。

Python

一括読み込みと出力

from xml.dom import minidom, Node
import sys

# stdin から読む。読み込みは、これで完了。
doc = minidom.parse(sys.stdin)

# 以下、色々な参照方法

# 全 print
doc.writexml(sys.stdout, encoding='UTF-8')
print  # 最後の改行が抜けるので付加

# 全部巡回して出力する
def tab(indent):
	return "  "*indent

def printAttributes(node, indent):
	attrs = node.attributes
	if attrs:
		keys = attrs.keys()
		for key in keys:
			print "%s%s = %s" % (tab(indent), key, node.getAttribute(key))

def printNode(node, indent):
	if node.nodeType == Node.TEXT_NODE:
		# <...>この部分<...>
		print "%s%s" % (tab(indent), `node.data`)
	else:
		print "%s<%s>" % (tab(indent), node.nodeName)

	indent += 1
	printAttributes(node, indent)

	for cn in node.childNodes:
		printNode(cn, indent + 1)

printNode(doc.childNodes[0], 0)

# すべての "foo" 要素を巡回
for node in doc.getElementsByTagName('foo'):
	printNode(node, 0)

メニューに戻る

Ruby

一括読み込みと出力

require 'rexml/document'

# stdin から読む。読み込みは、これで完了。
doc = REXML::Document.new STDIN

# 以下、色々な参照方法

# 全 print
doc.write STDOUT

# 宣言部()
print doc.xml_decl

# 全部巡回して出力する
def tab(indent)
	"  "*indent
end

def printAttributes(attr, indent)
	attr.each { |name, value|
		print tab(indent)
		puts "#{name} = '#{value}'"
	}
end

def printElement(element, indent)
	print tab(indent)
	puts "<#{element.name}>"

	indent += 1
	printAttributes(element.attributes, indent)

	element.elements.each { |e|
		printElement(e, indent)
	}
end

printElement(doc.root, 0)

# 第一階層の "foo" 要素を巡回
doc.root.elements.each("foo") { |e|
	printElement(e, 0)
} 

ストリーム読み込み

require 'rexml/streamlistener'

# 以下の二つの関数は、後の class 内にあるべきだが、
# 用例として後の class の見通しが良くなるように外に置いた。
def tab(indent)
	"  "*indent
end

def printAttributes(attr, indent)  
    attr.each { |name, value|  
        print tab(indent)  
        puts "#{name} = '#{value}'"  
    }  
end  

class PrintAll
	include REXML::StreamListener

	# 宣言部で呼ばれる
	def xmldecl(version, encoding, standalone)
		puts "version = #{version}"
		puts "encoding = #{encoding}"
		puts "standalone = #{standalone}"
	end

	# 最初に呼ばれる
	def initialize
		@indent = 0
	end

	# 要素開始で呼ばれる
	def tag_start(name, attrs)
		print tab(@indent)
		puts "<#{name}>"
		@indent += 1
		printAttributes(attrs, @indent)
	end

	# 要素終了で呼ばれる
	def tag_end(x)
		@indent -= 1
	end
end

REXML::Parsers::StreamParser.new(STDIN, PrintAll.new).parse

メニューに戻る