怎样用 python 解析三层结构 XML

lmxl/beautifulsoup 以及其它各种xml解析库/包
■网友
4/11更新:突然发现可以上传图片了,传几张图片,然后把代码的语言说明清楚了,好看一点。
最近正在写这个方面的东西,算是自己造轮子玩,随便说几句,说的不对请轻喷。
Python开箱既用的特性为我们提供了丰富的库来解析XML文档,不需要第三方库,标准库就有很多,我们这里用xml库进行解析。
通过如下的语句调用xml库:
import xml.etree.ElementTree as ETimport json#通过json库将解析之后的字典dump成为JSON在这里我将题主的问题复杂化一点,要求解析一个XML文档,并按照一定的格式返回相应的JSON数据(相信做过微信公众号开发的同学一定知道为什么会有这样的需求)。
我有如下的思路:
首先,解析过后的XML文档可以看作一个树,不过是多叉的,而且层数不一定。于是,我这里采用了深度优先的方式来对解析过的XML树进行遍历。遍历有两种方式,递归和循环,在Python中,因为性能的原因,选择循环可能在解析比较大的文档时有一定优势。解析树的过程可以这样来想:
进行一个循环,从根节点向树的叶子节点进发,当发现了下一层节点均是叶子节点时,我遍历该节点的子节点列表,对他们的数据进行获取,合并,并删除这些节点。之后,返回上一层节点,将已经合并过的这个节点删除,继续循环。 【怎样用 python 解析三层结构 XML】 那进行这个循环的条件是什么呢?当树的枝干不断地被砍去之后,最终会在一个循环,你的当前节点会回到根节点,而最后一次合并完成之后,根节点的子节点也全部消失,所以循环条件可以为:根节点有子节点。
那么如何记录上一层节点呢?可以用一个列表,来保存当前的子节点的路径,每次的父节点便是该列表的最后一个。
于是文字流程图可以这样设计:
\t\twhile循环条件 : 根节点有子节点\t\t当前结点 -\u0026gt; 获取当前结点子节点列表 -\u0026gt; \t\t遍历当前结点的每一个子节点,查询遍历节点是否有子节点 -\u0026gt;\t\t有 : 记录当前节点下标,遍历节点作为当前节点,退出循环;\t\t无 : 则该节点的所有子节点均为叶子节点 -\u0026gt; 合并当前结点的所有子节点到当前节点 -\u0026gt;\t\t\t 父节点取出一个作为当前节点\t\t继续循环
我画几张图说一下这个过程。
怎样用 python 解析三层结构 XML

这个是最初的那个树(尽管实际情况比个复杂,但是对算法本身的适用性没有影响)
首先从根结点A出发,假如从左手的第一个子节点开始,也就是B。我们对B的子节点遍历(也就是D,E)于是发现D,E并不都没有子节点,也就是说D,E并不都是叶子节点于是我们将B存到以前的记录里,并将当前节点设置为E对E进行(2)的步骤,我们发现E的两个子节点(也就是H,I)都没有子节点,也就是都是叶子节点了于是我们进行第一次合并,合并H,I的数据,并删除H,I两个子节点怎样用 python 解析三层结构 XML

之后我们从历史中取出父节点节点,并设置为当前节点(也就是B)
然后进行了第二次合并:
怎样用 python 解析三层结构 XML

于是当前节点设置为了A,之后进行第三次合并:
怎样用 python 解析三层结构 XML

进行了最后一次合并之后,只剩下了一个孤零零的A:
怎样用 python 解析三层结构 XML


推荐阅读