我正在尝试使用lxml.objectify package
重新创建以下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中输出一部分电话信息。有没有人有任何想法?
答案 0 :(得分:1)
您应该创建objectify.Element
个对象,并将它们添加为root.customers
的子对象。
例如,插入两个电话号码可以这样做:
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)
。
有关objectify.deannotate
的确切参数,请参见lxml's objectify documentation。
(如果您使用的是旧版本的lxml,但不包含cleanup_namespaces
关键字参数,请改为:
from lxml import etree
# ...
objectify.deannotate(root, xsi_nil=True)
etree.cleanup_namespaces(root)
)
答案 1 :(得分: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))
我已经在这里对其进行了硬编码,但您可以转换为数据循环。这是否适用于您的目的?