Python 中 XML 的漂亮打印


在 Python 中处理 XML 数据时,确保其可读性和结构可以极大地增强代码理解和可维护性。XML 的漂亮打印,或者使用适当的缩进和换行符对其进行格式化,是实现这些目标的宝贵技术。

在本文中,我们探讨了使用 Python 对 XML 进行漂亮打印的两种不同方法:xml.dom.minidom 和 xml.etree.ElementTree。通过了解这些方法,开发人员可以有效地以组织化和视觉上吸引人的方式呈现 XML 数据,从而促进更轻松的分析和操作。

如何在 Python 中进行 XML 漂亮打印?

以下是我们可以使用两种方法在 Python 中执行漂亮打印的方法:

方法 1:使用 xml.dom.minidom

以下是我们将遵循使用 xml.dom.minidom 执行漂亮打印的步骤:

  • 导入所需的模块:我们首先导入 `xml.dom.minidom` 模块,该模块为 XML 解析提供了轻量级的文档对象模型 (DOM) API 实现。

  • 定义 `pretty_print_xml_minidom` 函数:此函数以 XML 字符串作为输入,并负责使用 `xml.dom.minidom` 解析和漂亮打印 XML。

  • 解析 XML 字符串:在 `pretty_print_xml_minidom` 函数内部,我们使用 `xml.dom.minidom.parseString()` 方法解析 XML 字符串并创建 DOM 对象。

  • 漂亮打印 XML:接下来,我们对 DOM 对象使用 `toprettyxml()` 方法来生成漂亮打印的 XML 字符串。我们将 `indent` 参数的值传递为 `" "` 以指定所需的缩进级别(在本例中为两个空格)。

  • 删除空行:默认情况下,`toprettyxml()` 会在输出中添加空行。为了删除这些空行,我们将漂亮的 XML 字符串按换行符 (`\n`) 分割,删除每行开头的或结尾的空格,然后将非空行重新连接在一起。

  • 打印漂亮的 XML:最后,我们打印生成的漂亮 XML 字符串。

程序 2:使用 xml.etree.ElementTree

以下是我们将遵循使用 xml.etree.ElementTree 执行漂亮打印的步骤:

  • 导入所需的模块:我们首先导入 `xml.etree.ElementTree` 模块,该模块提供了一个快速有效的 API 用于解析和操作 XML。

  • 定义 `indent` 函数:这是一个自定义函数,它递归地向 XML 元素添加缩进。它接收一个 `elem` 参数(XML 元素)和一个可选的 `level` 参数来指定当前缩进级别(默认为 0)。

  • 缩进 XML:在 `indent` 函数内部,我们通过修改 XML 元素的 `text``tail` 属性来添加缩进。`text` 属性表示开始标签后的文本,`tail` 属性表示结束标签前的文本。通过向这些属性添加缩进,我们实现了漂亮打印。

  • 定义 `pretty_print_xml_elementtree` 函数:此函数以 XML 字符串作为输入,并负责使用 `xml.etree.ElementTree` 解析和漂亮打印 XML。

  • 解析 XML 字符串:在 `pretty_print_xml_elementtree` 函数内部,我们使用 `ET.fromstring()` 方法解析 XML 字符串并创建 ElementTree 对象。

  • 缩进 XML:我们对 XML 的根元素调用 `indent()` 函数,以递归地向所有元素添加缩进。

  • 将 XML 元素转换回字符串:我们使用 `ET.tostring()` 方法将 XML 元素转换回字符串表示形式。我们将 `encoding` 参数的值传递为 `"unicode"` 以确保生成的字符串正确编码。

  • 打印漂亮的 XML:最后,我们打印生成的漂亮 XML 字符串。

这两个程序都提供了不同的方法来实现 XML 的漂亮打印。第一个程序利用 `xml.dom.minidom` 提供的 DOM API 来解析和漂亮打印 XML,而第二个程序使用 `xml.etree.ElementTree` 模块并定义了一个自定义函数来递归地向 XML 元素添加缩进。

以下是使用上述两种方法的程序示例:

程序 1:使用 xml.dom.minidom

import xml.dom.minidom

def pretty_print_xml_minidom(xml_string):
   # Parse the XML string
   dom = xml.dom.minidom.parseString(xml_string)

   # Pretty print the XML
   pretty_xml = dom.toprettyxml(indent="  ")

   # Remove empty lines
   pretty_xml = "\n".join(line for line in pretty_xml.split("\n") if line.strip())

   # Print the pretty XML
   print(pretty_xml)

# Example usage
xml_string = '''
<root>
  <element attribute="value">
   <subelement>Text</subelement>
  </element>
</root>
'''

pretty_print_xml_minidom(xml_string)

输出

<?xml version="1.0" ?>
<root>
  <element attribute="value">
   <subelement>Text</subelement>
  </element>
</root>

程序 2:使用 xml.etree.ElementTree

import xml.etree.ElementTree as ET

def indent(elem, level=0):
   # Add indentation
   indent_size = "  "
   i = "\n" + level * indent_size
   if len(elem):
      if not elem.text or not elem.text.strip():
         elem.text = i + indent_size
      if not elem.tail or not elem.tail.strip():
         elem.tail = i
      for elem in elem:
         indent(elem, level + 1)
      if not elem.tail or not elem.tail.strip():
         elem.tail = i
   else:
      if level and (not elem.tail or not elem.tail.strip()):
         elem.tail = i

def pretty_print_xml_elementtree(xml_string):
   # Parse the XML string
   root = ET.fromstring(xml_string)

   # Indent the XML
   indent(root)

   # Convert the XML element back to a string
   pretty_xml = ET.tostring(root, encoding="unicode")

   # Print the pretty XML
   print(pretty_xml)

# Example usage
xml_string = '''
<root>
  <element attribute="value">
   <subelement>Text</subelement>
  </element>
</root>
'''

pretty_print_xml_elementtree(xml_string)

输出

<root>
  <element attribute="value">
   <subelement>Text</subelement>
  </element>
</root>

结论

总之,在 Python 中对 XML 进行漂亮打印对于提高 XML 数据的可读性和结构至关重要。无论使用 xml.dom.minidom 还是 xml.etree.ElementTree 库,开发人员都可以轻松地使用正确的缩进格式化 XML。通过采用这些技术,程序员可以增强代码理解,简化调试,并在 Python 项目中使用 XML 数据时促进更好的协作。

更新于: 2023-07-25

7K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告