在Python中现代的XML转换方法是什么?
我需要在一些复杂的XML和扁平文件格式之间进行双向转换,使用Python来实现。我有点跟不上时代了,不知道在2011年这个遥远的未来,人们是怎么解决这个问题的。
我已经更新了对各种Python XML库的了解,但自从我上次接触XSLT已经过去8年了,惊讶地发现这在网上搜索时仍然很常见。
那么,如何进行复杂的XML数据转换呢?
我想用Python来做这个,因为这些文档之间并不是直接对应的,还需要一些处理和计算。不过,我还是希望能把尽可能多的工作交给规则引擎来处理。
编辑:为了更清楚,我更感兴趣的是技术方面,而不是具体的库或工具,但请也分享这些。我尽量避免使用“模式”这个词,但这肯定是一个常见的问题。
编辑 2:我仍然觉得没有关于一般技术的好答案,但我最初遇到的问题是通过Bots EDI框架解决的,用于文档翻译。这个框架主要集中在EDI上,但也可以用于通用翻译。不过,它是一个比较重的解决方案。
4 个回答
嗨,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,就很容易更改)。
希望这些对你有帮助。虽然我希望能提供更多帮助,但这个问题比较开放。
虽然这个工具主要是用来写XML的,但XMLwitch真的非常棒。如果你需要把其他格式的数据转换成XML,我强烈推荐这个工具!
对于Python,这里有一个关于可用的XML库和模块的详细列表:
http://wiki.python.org/moin/PythonXml
如果你在寻找比XSLT更简单的东西,XMLStarlet是一个命令行工具集,可能会对你有帮助:
http://xmlstar.sourceforge.net/
像所有命令行工具一样,这个工具并不是专门为Python设计的,但可以很容易地集成到Python脚本中。