XMLを使ってみた

日曜日, 1月 9th, 2011 by

PythonでXMLを読んでみたので、メモを残しておきます。JavaやPHPで同じような処理を書いたこともありますが、Pythonでの記述が一番楽だと感じました。

まずは、ライブラリをインポート。parseはファイルを解析してDOMを作る関数、parseStringは文字列を解析してDOMを作る関数です。

1
from xml.dom.minidom import parse, parseString

文字列からDOMを作ってみました。

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
>>> dom = parseString("<hoge><foo></foo><bar/></hoge>")
>>> print dom
<xml.dom.minidom.Document instance at 0x000000000235D9C8>
>>> type(dom)
<type 'instance'>
>>> dir(dom)
['ATTRIBUTE_NODE', 'CDATA_SECTION_NODE', 'COMMENT_NODE', 'DOCUMENT_FRAGMENT_NODE
'
, 'DOCUMENT_NODE', 'DOCUMENT_TYPE_NODE', 'ELEMENT_NODE', 'ENTITY_NODE', 'ENTITY
_REFERENCE_NODE'
, 'NOTATION_NODE', 'PROCESSING_INSTRUCTION_NODE', 'TEXT_NODE', '
__doc__'
, '__init__', '__module__', '__nonzero__', '_call_user_data_handler', '_
child_node_types'
, '_create_entity', '_create_notation', '_elem_info', '_get_act
ualEncoding'
, '_get_async', '_get_childNodes', '_get_doctype', '_get_documentEle
ment'
, '_get_documentURI', '_get_elem_info', '_get_encoding', '_get_errorHandler
'
, '_get_firstChild', '_get_lastChild', '_get_localName', '_get_standalone', '_g
et_strictErrorChecking'
, '_get_version', '_id_cache', '_id_search_stack', '_magi
c_id_count'
, '_set_async', 'abort', 'actualEncoding', 'appendChild', 'async', 'a
ttributes'
, 'childNodes', 'cloneNode', 'createAttribute', 'createAttributeNS', '
createCDATASection'
, 'createComment', 'createDocumentFragment', 'createElement',
 'createElementNS', 'createProcessingInstruction', 'createTextNode', 'doctype',
'documentElement', 'documentURI', 'encoding', 'errorHandler', 'firstChild', 'get
ElementById'
, 'getElementsByTagName', 'getElementsByTagNameNS', 'getInterface',
'getUserData', 'hasChildNodes', 'implementation', 'importNode', 'insertBefore',
'isSameNode', 'isSupported', 'lastChild', 'load', 'loadXML', 'localName', 'names
paceURI'
, 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 'normalize', 'owne
rDocument'
, 'parentNode', 'prefix', 'previousSibling', 'removeChild', 'renameNod
e'
, 'replaceChild', 'saveXML', 'setUserData', 'standalone', 'strictErrorChecking
'
, 'toprettyxml', 'toxml', 'unlink', 'version', 'writexml']

XML表現に変換してみました。中身が空のタグが空要素タグに書き換わっていたり、先頭にXMLのバージョンが追加されたりしています。

1
2
>>> print dom.toxml()
<?xml version="1.0" ?><hoge><foo/><bar/></hoge>

toprettyxmlメソッドを使うと、美しいXMLが出力されます。

1
2
3
4
5
6
>>> print dom.toprettyxml()
<?xml version="1.0" ?>
<hoge>
        <foo/>
        <bar/>
</hoge>

domのchildNodesには、トップレベルのノードのhogeが含まれています。

1
2
3
4
>>> for node in dom.childNodes:
...   print node
...
<DOM Element: hoge at 0x2362988>

hogeノードの子要素には、foo要素とbar要素が含まれています。

1
2
3
4
5
6
>>> for node in dom.childNodes:
...   for subnode in node.childNod
...     print subnode
...
<DOM Element: foo at 0x2362a88>
<DOM Element: bar at 0x2362b08>

タグ名指定で子要素を取り出します。結果は該当タグのリストです。

1
2
>>> print dom.getElementsByTagName('hoge')
[<DOM Element: hoge at 0x2362988>]

さらに子要素を取り出します。

1
2
>>> print dom.getElementsByTagName('hoge')[0].getElementsByTagName('foo')
[<DOM Element: foo at 0x2362a88>]

属性を取り出します。

1
2
3
4
5
>>> dom2 = parseString('<shop><book id="book1" title="python25"/></shop>')
>>> print dom2.getElementsByTagName('shop')[0].getElementsByTagName('book')[0].getAttribute('title')
python25
>>> print dom2.getElementsByTagName('shop')[0].getElementsByTagName('book')[0].getAttribute('id')
book1

Facebook comments:

comments

Leave a Reply


Get Adobe Flash player
single