Python 数据解析:JSON与XML

302 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情 JSON是一种轻量级的文本数据交换格式。与XML 相比,拥有更小、更快、更易解析的特点。 JSON 中数据都以名称:值的形式表示,名称包括在一对双引号" "中,值则有多种形式,多条数据之间用逗号,隔开

1.数据类型

JSON 的值可以是如下类型:

  • 字符串(在双引号中)
  • 数字(整数或浮点数)
  • 逻辑值(true 或 false
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null
2.数组

JSON 的数组用一对方括号[]表示,类似于list,数组元素用逗号,隔开,元素值可以是任意 JSON 数据类型 json库提供了一个函数loads,用于从 Python 的字符串中解析 JSON 数据。使用它的方法很简单,只需将含有 JSON 数据的字符串当做参数传递给它,它的返回值就是由 Python 中的基础数据类型组成的对象。

  • JSON 各种数据类型在解析后,对应的 Python 基础数据类型如下表:
JSONPython
object(对象)dict
array(数组)list
string(字符串)unicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone
  • Python 基础数据类型到 JSON 数据类型的对应表格:
PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull
注意:dumps没有可选参数encoding,当要转化的对象含有中文等非 ASCII 字符时,建议指定可选参数ensure_asciiFalse。否则非 ASCII 的字符将会被显示成\uXXXX的形式

3.元素的命名规则:

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格
  • 名称是大小写敏感的
    一个元素可以有多个属性,每个属性都有它自己的名称和取值。同一个元素下,属性名称不能重复。属性的值一定要用双引号或者单引号括起来
4.事件处理器

事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。
一个事件处理器必须是ContentHandler类型的子类,通过重写父类的以下函数来响应解析器的事件请求:

  • cha\fracters(content)函数,它会在以下时机被调用:

    • 如果从一行开始,遇到标签之前,存在字符,则content的值为这些字符串;
    • 如果从一个标签,遇到下一个标签之前,存在字符,则content的值为这些字符串;
    • 如果从一个标签,遇到行结束符(换行符)之前,存在字符,则content的值为这些字符串;
    • 标签可以是开始标签,也可以是结束标签。
  • startDocument()函数,它在文档启动的时候调用;
  • endDocument()函数,它在解析器到达文档结尾时调用;
  • startElement(name, attrs)函数,它在遇到 XML 开始标签时调用,name是标签的名字,attrs是标签的属性值字典;
  • endElement(name)函数,它在遇到 XML 结束标签时调用。
xml.etree.ElementTree`模块是一个轻量级的 DOM(文件对象模型),具有方便友好的 API。代码可用性好,速度快,消耗内存少。\

ElementTree模块大致可以三部分:ElementTree类,Element类以及一些操作 XML 的函数。

5.查找元素

Element对象和ElementTree对象都提供了用于在子元素查找元素的函数:

  • find(name):用于在直接子元素中,查找一个名为name的元素;
  • findall(name):用于在直接子元素中,查找所有名为name的元素,它的返回值可以看做一个所有元素都是Element对象的tuple对象,可以对它进行迭代操作或者索引[]操作;
  • iter(name = None):用于在当前元素下的所有子元素中,查找名为name的元素,如果不指定name,则返回所有子元素。它返回一个迭代器对象