如何使用lxml.objectify生成XML

时间:2015-02-09 09:41:03

标签: lxml

我目前正在使用amara 2进行XML工作,但是在寻找与Py3和Py2一起使用的解决方案时,我在lxml.objectify上取得了进展,但在如何生成这个问题方面存在问题。

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns="http://www.vinoxml.org/XMLschema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
<querycreator>
  <name>The Wine Cellar Book - version 15.1</name>
</querycreator>

使用lxml和此代码段,我得到以下内容。

doc_header = """<query></query>"""

doc = etree.ElementTree(etree.fromstring(doc_header))
docO = objectify.fromstring(doc_header)

objectify.SubElement(docO, "querycreator")
docO.querycreator.name = objectify.DataElement(u"The Wine Cellar Book - version %s"
                                               % 15.1)


<query>
  <querycreator>
    <name>The Wine Cellar Book - version 15.1</name>
  </querycreator>
</query>

使用amara我可以使用这样的doc_header:

doc_header = """<query xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.vinoxml.org/XMLschema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"></query>"""

但是我使用lxml.objectify,我在docO.querycreator上得到了属性错误。

我也尝试过objectify.Elementmaker,但也无法使其工作。

1 个答案:

答案 0 :(得分:0)

通过使用ElementMaker,我获得了命名空间。

myE = objectify.ElementMaker(namespace="http://www.vinoxml.org/XMLschema",
                             nsmap={None : "http://www.vinoxml.org/XMLschema"})

docO = myE.query(myE.querycreator())

docO.querycreator.name = objectify.DataElement(u"The Wine Cellar Book - version %s"
                                               % 15.1)

objectify.deannotate(docO)
etree.cleanup_namespaces(docO)
print(etree.tostring(docO, pretty_print=True,
                     encoding="UTF-8", xml_declaration=True))

我得到了vinoXML命名空间,不确定我需要:xsi和:xsd。

<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://www.vinoxml.org/XMLschema">
  <querycreator>
    <name>The Wine Cellar Book - version 15.1</name>
  </querycreator>
</query>