入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

python的XML正确的打开姿势是这样滴+

创建时间:2017-11-14 投稿人: zzz 浏览次数:172

python的XML正确的打开姿势是这样滴+

XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。

DOM vs SAX

操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。

正常情况下,优先考虑SAX,因为DOM实在太占内存。

在Python中使用SAX解析XML非常简洁,通常我们关心的事件是start_elementend_elementchar_data,准备好这3个函数,然后就可以解析xml了。

举个例子,当SAX解析器读到一个节点时:

<a href="/">python</a>

会产生3个事件:

  1. start_element事件,在读取<a href="/">时;

  2. char_data事件,在读取python时;

  3. end_element事件,在读取</a>时。

用代码实验一下:

from xml.parsers.expat import ParserCreateclass DefaultSaxHandler(object): def start_element(self, name, attrs): print("sax:start_element: %s, attrs: %s" % (name, str(attrs))) def end_element(self, name): print("sax:end_element: %s" % name) def char_data(self, text): print("sax:char_data: %s" % text)xml = r"""<?xml version="1.0"?><ol> <li><a href="/python">Python</a></li> <li><a href="/ruby">Ruby</a></li></ol>"""handler = DefaultSaxHandler()parser = ParserCreate()parser.StartElementHandler = handler.start_elementparser.EndElementHandler = handler.end_elementparser.CharacterDataHandler = handler.char_dataparser.Parse(xml)

需要注意的是读取一大段字符串时,CharacterDataHandler可能被多次调用,所以需要自己保存起来,在EndElementHandler里面再合并。

python的XML正确的打开姿势是这样滴+

除了解析XML外,如何生成XML呢?99%的情况下需要生成的XML结构都是非常简单的,因此,最简单也是最有效的生成XML的方法是拼接字符串:

L = []L.append(r"<?xml version="1.0"?>")L.append(r"<root>")L.append(encode("some & data"))L.append(r"</root>")return "".join(L)

如果要生成复杂的XML呢?建议你不要用XML,改成JSON。

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像
zzz