【问题标题】:Beautify xml in Python eTree在 Python eTree 中美化 xml
【发布时间】:2015-06-22 19:26:18
【问题描述】:

我有一个简单的 py 脚本,它可以创建一个 xml 文件并保存它,我想知道是否有一种简单的方法可以缩进它?

import xml.etree.cElementTree as ET


root = ET.Element("root")
doc = ET.SubElement(root, "doc", location="one")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

我查看了其他一些 SO Q&A Pretty printing XML in Python,但这些似乎主要需要其他外部库?并且想知道是否有办法不使用这些?

感谢您的帮助。

【问题讨论】:

  • minidom 在标准库中。您可以使用minidom 创建文档,然后调用其toprettyxml 方法。
  • 我看不到该脚本如何“制作并保存 xml 文件”。保存文件的代码在哪里?
  • @Robᵩ 抱歉,我忘了包含存档
  • @unutbu 你能告诉我怎么做吗?

标签: python xml lxml elementtree


【解决方案1】:

你可以使用标准库的minidom模块的toprettyxml method

import xml.dom.minidom as minidom

xml = minidom.Document()
root = xml.createElement("root")
xml.appendChild(root)

doc = xml.createElement("doc")
doc.setAttribute("location", "one")
root.appendChild(doc)

field = xml.createElement("field1")
field.setAttribute("name", "blah")
text = xml.createTextNode("some value1")
field.appendChild(text)
doc.appendChild(field)

field = xml.createElement("field2")
field.setAttribute("name", "asdfasd")
text = xml.createTextNode("some value2")
field.appendChild(text)

doc.appendChild(field)
print(xml.toprettyxml(indent=' '*4))

产量

<?xml version="1.0" ?>
<root>
    <doc location="one">
        <field1 name="blah">some value1</field1>
        <field2 name="asdfasd">some value2</field2>
    </doc>
</root>

或者,如果您更喜欢 ElementTree 创建 XML 的方法并且不介意 效率有点低,您可以使用ElementTree 编写未格式化的 XML 到 StringIO(对于 Python2)或 ByteIO(对于 Python3),将其解析为 minidom 文档,然后使用toprettyxml 再次将其写回:

import xml.etree.cElementTree as ET
import xml.dom.minidom as minidom

try:
    # for Python2
    from cStringIO import StringIO as BytesIO
except ImportError:
    # for Python3
    from io import BytesIO

root = ET.Element("root")
doc = ET.SubElement(root, "doc", location="one")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"
buf = BytesIO()
buf.write(ET.tostring(root))
buf.seek(0)
root = minidom.parse(buf)
print(root.toprettyxml(indent=' '*4))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多