[英]Python prettify create xml version
when I launch this code he generated xml file which contain xml version <\\?xml version="1.0" ?>, I tried exclude this line using xml_declaration=False, but error appears:当我启动此代码时,他生成了包含 xml 版本 <\\?xml version="1.0" ?> 的 xml 文件,我尝试使用 xml_declaration=False 排除此行,但出现错误:
TypeError: prettify() got an unexpected keyword argument 'encoding'
类型错误:prettify() 得到了一个意外的关键字参数“编码”
How I can cut this string from my xml file ?如何从我的 xml 文件中剪切此字符串?
from xml.etree import ElementTree
from xml.dom import minidom
from lxml.etree import Element, SubElement
def prettify(templateXml):
rough_string = ElementTree.tostring(templateXml)
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t")
top = Element('Options')
element = SubElement(top, 'Some ID')
element.text = ' '
element = SubElement(top, 'Test0')
element.text = 'Some text'
SubElement(top, 'Test1', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test2', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test3', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test4', {'enabled': 'true', 'Test5': 'true', 'Zero': 'true'})
SubElement(top, 'Test6', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
SubElement(top, 'Test7', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
SubElement(top, 'Test8', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
with open("output/some_xml_file.xml", 'w') as f:
f.write(prettify(top))
Issue solved following changes:问题解决了以下更改:
from xml.etree import ElementTree
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement
def prettify(elem):
xml = ElementTree.tostring(elem)
reparsed = minidom.parseString(xml)
return reparsed.toprettyxml(indent="\t")
def strip_prologue(xml):
if xml.startswith("<?xml"):
return xml[xml.index(">") + 1:].lstrip()
else:
return xml
def generate_xml():
top = Element('Heards')
element = SubElement(top, 'SomeID')
element.text = ' '
element = SubElement(top, 'Test0')
element.text = 'Some text'
SubElement(top, 'Test1', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test2', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test3', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test4', {'enabled': 'true', 'Test5': 'true', 'Zero': 'true'})
SubElement(top, 'Test6', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
SubElement(top, 'Test7', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
SubElement(top, 'Test8', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
with open("output/some_xml_file.xml", 'w') as f:
f.write(strip_prologue(prettify(top)))
Simply use lxml's prettyprint argument in tostring()
.只需在
tostring()
使用 lxml 的prettyprint参数。 No need for minidom
or even xml.etree
.不需要
minidom
甚至xml.etree
。 Python's lxml
can serve as your full XML handler. Python 的
lxml
可以用作完整的 XML 处理程序。 And be sure to remove the space in Some ID for valid XML names for well-formedness.并确保删除Some ID中有效 XML 名称中的空格以确保格式正确。
import lxml.etree as et
from lxml.etree import Element, SubElement
top = Element('Options')
element = SubElement(top, 'SomeID')
element.text = ' '
element = SubElement(top, 'Test0')
element.text = 'Some text'
SubElement(top, 'Test1', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test2', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test3', {'enabled': 'true', 'Values': 'true'})
SubElement(top, 'Test4', {'enabled': 'true', 'Test5': 'true', 'Zero': 'true'})
SubElement(top, 'Test6', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
SubElement(top, 'Test7', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
SubElement(top, 'Test8', {'enabled': 'true', 'Values': 'true', 'Zero': 'true'})
with open("output/some_xml_file.xml", 'wb') as f:
f.write(et.tostring(top, xml_declaration=True, pretty_print=True, encoding="utf-8"))
Output输出
<?xml version='1.0' encoding='utf-8'?>
<Options>
<SomeID> </SomeID>
<Test0>Some text</Test0>
<Test1 Values="true" enabled="true"/>
<Test2 Values="true" enabled="true"/>
<Test3 Values="true" enabled="true"/>
<Test4 Test5="true" Zero="true" enabled="true"/>
<Test6 Values="true" Zero="true" enabled="true"/>
<Test7 Values="true" Zero="true" enabled="true"/>
<Test8 Values="true" Zero="true" enabled="true"/>
</Options>
I was stuck with a similar error and until I could find a good solution to do this, I used a not-so-great method that parsed my un-indented data and used the tostring method without using minidom.我遇到了类似的错误,直到我找到一个很好的解决方案来解决这个问题,我使用了一个不太好的方法来解析我的未缩进的数据并使用 tostring 方法而不使用 minidom。
from lxml import etree
tree = lxml.etree.parse("yourfile.xml")
pretty = lxml.etree.tostring(tree, encoding="unicode", pretty_print=True)
print(pretty)
This worked for me when I got the same error so just putting it out there.当我遇到同样的错误时,这对我有用,所以把它放在那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.