在Python中现代的XML转换方法是什么?

13 投票
4 回答
4356 浏览
提问于 2025-04-17 02:20

我需要在一些复杂的XML和扁平文件格式之间进行双向转换,使用Python来实现。我有点跟不上时代了,不知道在2011年这个遥远的未来,人们是怎么解决这个问题的。

我已经更新了对各种Python XML库的了解,但自从我上次接触XSLT已经过去8年了,惊讶地发现这在网上搜索时仍然很常见。

那么,如何进行复杂的XML数据转换呢?

我想用Python来做这个,因为这些文档之间并不是直接对应的,还需要一些处理和计算。不过,我还是希望能把尽可能多的工作交给规则引擎来处理。

编辑:为了更清楚,我更感兴趣的是技术方面,而不是具体的库或工具,但请也分享这些。我尽量避免使用“模式”这个词,但这肯定是一个常见的问题。

编辑 2:我仍然觉得没有关于一般技术的好答案,但我最初遇到的问题是通过Bots EDI框架解决的,用于文档翻译。这个框架主要集中在EDI上,但也可以用于通用翻译。不过,它是一个比较重的解决方案。

4 个回答

0

嗨,Dimitre,我在Python中使用lxml来处理XML。

我分享了一些管理大量XML模式、命名空间等的技巧。你可以查看这个链接:自动XSD验证

一个建议是尽量使用完整的XPath。

比如说,如果我有一个复杂的类型:

<Person>
 <name/>
 <age/>
</person>

如果我不使用/Person/name,可能会遇到问题,因为后来这个复杂类型变成了:

<person>
 <name/>
 <age/>
 <child>
   <son>
     <name/>
     <age/>
   </son>
</child>
</person>

原因是现在'name'在多个地方都存在。

另外,要注意这个例子中允许有多个“人”的模式。你可能需要在XPath中提供一个“键”,以确定你指的是哪个人。假设你的XML中有5或6个Person,虽然XPath是一样的,但名字是独一无二的,这个名字就可以作为你引用每个特定人的“键”。

我还建议你为lxml写一些适合自己需求的封装函数。我做的就是创建了一个xmlUtil.py文件,里面包含了我需要的通用XML函数。然后我又创建了一个myXML.py文件,里面有关于我特定XML和行为的假设。xmlUtil.py中的函数只接受XML内容(这样如果我决定使用其他东西而不是lxml,就很容易更改)。

希望这些对你有帮助。虽然我希望能提供更多帮助,但这个问题比较开放。

1

虽然这个工具主要是用来写XML的,但XMLwitch真的非常棒。如果你需要把其他格式的数据转换成XML,我强烈推荐这个工具!

1

对于Python,这里有一个关于可用的XML库和模块的详细列表:

http://wiki.python.org/moin/PythonXml

如果你在寻找比XSLT更简单的东西,XMLStarlet是一个命令行工具集,可能会对你有帮助:

http://xmlstar.sourceforge.net/

像所有命令行工具一样,这个工具并不是专门为Python设计的,但可以很容易地集成到Python脚本中。

撰写回答