简体   繁体   English

Python 美化创建 xml 版本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM