【问题标题】:Python prettify create xml versionPython美化创建xml版本
【发布时间】:2017-10-03 14:39:31
【问题描述】:

当我启动此代码时,他生成了包含 xml 版本 的 xml 文件,我尝试使用 xml_declaration=False 排除此行,但出现错误:

TypeError: prettify() 得到了一个意外的关键字参数“编码”

如何从我的 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))

【问题讨论】:

  • 你需要告诉 write 或 prettify 方法你想使用什么编码我怀疑。看看这些方法的参数我敢打赌有一个参数编码,我会把它设置为“UTF-8”
  • return reparsed.toprettyxml(indent="\t", encoding='UTF-8') 一样只加了

标签: python xml prettify


【解决方案1】:

问题解决了以下变化:

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)))

【讨论】:

    【解决方案2】:

    只需在tostring() 中使用lxml 的prettyprint 参数。不需要minidom 甚至xml.etree。 Python 的lxml 可以作为完整的XML 处理程序。并确保删除 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"))
    

    输出

    <?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>
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的错误,直到找到一个好的解决方案,我使用了一种不太好的方法来解析我的未缩进数据并使用 tostring 方法而不使用 minidom。

      from lxml import etree
      
      tree = lxml.etree.parse("yourfile.xml")
      pretty = lxml.etree.tostring(tree, encoding="unicode", pretty_print=True)
      
      print(pretty) 
      

      当我遇到同样的错误时,这对我有用,所以把它放在那里。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 2014-10-16
        • 2022-01-24
        • 1970-01-01
        相关资源
        最近更新 更多