我目前正在使用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,但也无法使其工作。
答案 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>