8

この例のようなlxmlを使用して名前空間を指定しようとしています(ここから取得):

<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</TreeInventory>

使用するスキーマ インスタンスとスキーマの場所を追加する方法がわかりません。ドキュメンテーションは、次のようなことをすることで、私を始めました:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'
>>> TREE = '{%s}' % NS
>>> NSMAP = {None: NS}
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP)
>>> etree.tostring(tree, pretty_print=True)
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n'

ただし、インスタンスを指定してから場所を指定する方法がわかりません。これは のnsmapキーワード引数で実行できるようetree.Elementですが、方法がわかりません。

4

1 に答える 1

10

わかりやすくするために、さらにいくつかの手順を実行します。

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'

私が見る限り、要素noNamespaceSchemaLocationではなく、名前空間を付けたいのは属性です。TreeInventoryそう:

>>> location_attribute = '{%s}noNamespaceSchemaLocation' % NS    # f-string doesn't work in this case
>>> elem = etree.Element('TreeInventory', attrib={location_attribute: 'Trees.xsd'})
>>> etree.tostring(elem, pretty_print=True)
'<TreeInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Trees.xsd"/>\n'

これはあなたが望んでいたもののように見えます...もちろん、最初に属性なしで要素を作成してから、次のように属性を設定することもできます:

>>> elem = etree.Element('TreeInventory')
>>> elem.set(location_attribute, 'Trees.xsd')

パラメータについてはnsmap、シリアライゼーションで使用するプレフィックスを定義するためにのみ使用されると思います。この場合、問題の名前空間に一般的に使用されるプレフィックスが「xsi」であることを lxml が認識しているため、必要ありません。よく知られた名前空間でない場合は、優先する接頭辞を指定しない限り、おそらく「ns0」、「ns1」などの接頭辞が表示されるでしょう。(覚えておいてください: 接頭辞は重要ではありません)

于 2009-05-14T14:59:28.333 に答える