lxml.etreeを使用してJSONオブジェクトからxmlツリーを作成しようとしています。タグ名の中には、コロンを続けているものがあります:-
'settings:current'使ってみました
タグ名として「{settings}current」がありますが、これを取得します:-
ns0:current xmlns:ns0 = "settings"
はい、まず XML 名前空間を読んで理解してください。次に、それを使用して、名前空間を持つ XML ツリーを生成します:u
>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace'}
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'], nsmap=MY_NAMESPACES)
>>> etree.tostring(e)
'<settings:current xmlns:settings="http://example.com/url-for-settings-namespace"/>'
そして、それをデフォルトの名前空間と組み合わせることができます
>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace', None: 'http://example.com/url-for-default-namespace'}
>>> r=etree.Element('my-root', nsmap=MY_NAMESPACES)
>>> d=etree.Element('{%s}some-element' % MY_NAMESPACES[None])
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'])
>>> d.append(e)
>>> r.append(d)
>>> etree.tostring(r)
'<my-root xmlns:settings="http://example.com/url-for-settings-namespace" xmlns="http://example.com/url-for-default-namespace"><some-element><settings:current/></some-element></my-root>'
nsmap=MY_NAMESPACES
XML ツリー階層内に要素が必要であることに注意してください。その後、すべての子孫ノードがその宣言を使用できます。あなたの場合、そのビットがないため、lxml は次のような名前空間名を生成しますns0
また、新しいノードを作成するときは、名前空間名ではなく、タグ名に名前空間 URI を使用します。{http://example.com/url-for-settings-namespace}current