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 |