【问题标题】:Writing XML from Python : Python equivalent of .NET XmlTextWriter?从 Python 编写 XML:Python 相当于 .NET XmlTextWriter?
【发布时间】:2023-08-14 01:13:01
【问题描述】:

我有一些使用 XmlTextWriter 的 IronPython 代码,它允许我编写类似的代码

self.writer = System.Xml.XmlTextWriter(filename, None)
self.writer.Formatting = Formatting.Indented
self.writer.WriteStartElement(name)
self.writer.WriteString(str(text))
self.writer.WriteEndElement()

...

self.writer.Close()

我想让我的代码跨 Python 实现(CPython、IronPython 和 Jython)移植。是否有一个流式 Python XML 编写器可以用于此目的,而无需使用打印语句或在将其写入文件之前构建整个 DOM 树?

【问题讨论】:

  • 这和*.com/questions/1019895/…是一样的吗
  • @S.Lott 不,不是。您提到的问题是关于将 Python 数据结构直接序列化为 XML。这个问题是关于从 Python 生成特定的 XML 表单。

标签: python xml ironpython jython


【解决方案1】:

我从未使用过您所说的 .NET 实现,但听起来您最接近的是 Python 的 SAX parser(特别是 XMLGenerator class——一些示例代码 here )。

【讨论】:

  • 特别是 xml.sax.saxutils.XMLGenerator,它是 sax 的一部分,但不是真正的解析器。
【解决方案2】:

我编写了一个工具来促进从 Python 生成 XML(codetutorial

【讨论】:

  • “我是一个工具”?那是什么意思? ;)
  • 最优雅。您能否提供一个示例,说明在运行时我不知道元素名称的情况下如何使用它?
  • 它假定元素名称是已知的,所以听起来它不能解决你的问题。 (好吧,您可以编写类似 x = XMLegant() element_name = "root" el = getattr(x, element_name) 之类的东西,但这似乎违背了这一点。)
【解决方案3】:

我为此编写了一个名为 loxun 的模块:http://pypi.python.org/pypi/loxun/。它与 CPython 2.5 和 Jython 2.5 一起运行,但我从未尝试与 IronPython 一起使用。

示例用法:

with open("...", "wb") as out:
  xml = XmlWriter(out)
  xml.addNamespace("xhtml", "http://www.w3.org/1999/xhtml")
  xml.startTag("xhtml:html")
  xml.startTag("xhtml:body")
  xml.text("Hello world!")
  xml.tag("xhtml:img", {"src": "smile.png", "alt": ":-)"})
  xml.endTag()
  xml.endTag()
  xml.close()

结果:

<?xml version="1.0" encoding="utf-8"?>
<xhtml:html xlmns:xhtml="http://www.w3.org/1999/xhtml">
  <xhtml:body>
    Hello world!
    <xhtml:img alt=":-)" src="smile.png" />
  </xhtml:body>
</xhtml:html>

除其他功能外,它还可以在您编写时检测未对齐的标签、使用内存占用少的流式 API、支持 Unicode 并允许禁用漂亮的打印。

【讨论】: