0

lxml.objectifyパッケージで再作成しようとしている次のXMLがあります

<file>
  <customers>
    <customer>
        <phone>
            <type>home</type>
            <number>555-555-5555</number>
        </phone>
        <phone>
            <type>cell</type>
            <number>999-999-9999</number>
        </phone>
        <phone>
            <type>home</type>
            <number>111-111-1111</number>
        </phone>
    </customer>
   </customers>
</file>

電話要素を複数回作成する方法がわかりません。基本的に、私は次の機能しないコードを持っています:

    # create phone element 1
    root.customers.customer.phone = ""
    root.customers.customer.phone.type = data_dict['PRIMARY PHONE1']
    root.customers.customer.phone.number = data_dict['PRIMARY PHONE TYPE 1']

    # create phone element 2
    root.customers.customer.phone = ""
    root.customers.customer.phone.type = data_dict['PRIMARY PHONE2']
    root.customers.customer.phone.number = data_dict['PRIMARY PHONE TYPE 2']

    # create phone element 3
    root.customers.customer.phone = ""
    root.customers.customer.phone.type = data_dict['PRIMARY PHONE3']
    root.customers.customer.phone.number = data_dict['PRIMARY PHONE TYPE 3']

もちろん、結果のXMLで電話情報の1つのセクションのみを出力します。誰かアイデアはありますか?

4

2 に答える 2

1

objectify E-Factoryを使用して XML を構築するサンプル コードを次に示します。

from lxml import etree
from lxml import objectify

E = objectify.E

fileElem = E.file(
    E.customers(
        E.customer(
            E.phone(
                E.type('home'),
                E.number('555-555-5555')
            ),
            E.phone(
                E.type('cell'),
                E.number('999-999-9999')
            ),
            E.phone(
                E.type('home'),
                E.number('111-111-1111')
            )
        )
    )
)

print(etree.tostring(fileElem, pretty_print=True))

ここでハードコーディングしましたが、データのループに変換できます。それはあなたの目的に合っていますか?

于 2012-09-07T20:21:42.437 に答える
1

objectify.Elementオブジェクトを作成し、それらを の子として追加する必要がありますroot.customers

たとえば、2 つの電話番号を挿入するには、次のようにします。

phone = objectify.Element('phone')
phone.type = data_dict['PRIMARY PHONE1']
phone.number = data_dict['PRIMARY PHONE TYPE 1']
root.customers.customer.append(phone)

phone = objectify.Element('phone')
phone.type = data_dict['PRIMARY PHONE2']
phone.number = data_dict['PRIMARY PHONE TYPE 2']
root.customers.customer.append(phone)

xml を文字列に戻すときにこれらの要素に不要な属性が含まれている場合は、objectify.deannotate(root, xsi_nil=True, cleanup_namespaces=True). の正確なパラメータについては、lxml の objectify ドキュメントを参照してくださいobjectify.deannotate

cleanup_namespaces(キーワード引数を含まない古いバージョンの lxml を使用している場合は、代わりに次のようにします。

from lxml import etree
# ...
objectify.deannotate(root, xsi_nil=True)
etree.cleanup_namespaces(root)

)

于 2012-09-07T20:15:46.807 に答える