Python 中的 XML 或 ASCII 字符串/模板的内联?

2 投票
4 回答
1340 浏览
提问于 2025-04-16 02:37

我正在通过Python脚本生成复杂的XML文件,这些文件需要很多条件判断(比如这个例子:http://repository.azgs.az.gov/uri_gin/azgs/dlio/536/iso19139.xml)。我在处理多个XML或ASCII元数据标准,这些标准的结构往往不太好或者比较模糊。

在PHP中,我只需直接写出XML,并在需要的地方插入PHP代码片段。请问在Python中有没有简单的方法可以做到这一点?我希望能避免对所有XML进行转义。这样在模板上做小调整时也很方便,不用大改。

我稍微了解了一些Python的模板解决方案,但它们要么太死板,要么功能过于复杂。把整个XML放进一个XML对象里工作量很大,而且在更改XML或ASCII模板时灵活性也会降低。

谢谢大家的支持,特别是对新手的帮助!

4 个回答

1

试试一些现代的非XML基础的Python模板引擎,比如Mako或者Jinja2。它们很容易和你的项目结合在一起,这样你就可以写一些这样的代码:

<sometag>
%if a > b:
   <anothertag />
%endif
</sometag>

你还可以使用内联Python,包括赋值操作。

1

@Gintautas 提出的使用一个好的模板引擎的建议也是我首选的方案(特别是 Mako,它的“模板语言”基本上就是 Python 加上一些标记语言;-)。

不过,很多人喜欢用其他方法来生成 XML 文件,比如通过 DOM 来写。举个例子,可以使用(为了保持在标准库中)ElementTree,或者使用一个第三方包,虽然是第三方的,但安装起来非常简单,而且很受欢迎的 BeautifulSoup(如果你用的是 Python 3,建议使用它的 3.0.x 版本!),特别是 BeautifulStoneSoup 类(BeautifulSoup 类是用来处理 HTML 的,而 stone 这个是用来处理 XML 的)。

3

wgrunberg,

我使用Python自带的字符串模板类,像这样:

from string import Template
the_template = Template("<div id='$section_id'>First name: $first</div>")
print the_template.substitute(section_id="anID", first="Sarah")

上面的输出结果是:

<div id='anID'>First name: Sarah</div>

在上面的例子中,我展示了一个XML模板,但任何你能用字符串描述的“模板”都可以使用。

如果你想做条件判断,可以这样写:

print the_template.substitute(section_id="theID", first="Sarah" if 0==0 else "John")

如果你的条件判断比较复杂,不要像上面那样直接写在一行里,可以考虑把它们分开写成闭包或函数。

撰写回答