python解析XML

XML样例

<?xml version="1.0" encoding="UTF-8"?>
<rows>
    <row>
        <ID>
            <![CDATA[2c908db57da3aadc017e41c612403434]]>
        </ID>
        <TABLE_NAME>
            <![CDATA[CS_STUDENT]]>
        </TABLE_NAME>
        <STU_ID>
            <![CDATA[0001]]>
        </STU_ID>
        <SQL_STATEMENT>
            <![CDATA[DELETE FROM CS_STUDENT WHERE STU_ID = '0001']]>
        </SQL_STATEMENT>
    </row>
    <row>
        <ID>
            <![CDATA[2c908db57da3aadc017e51158f2339ec]]>
        </ID>
        <TABLE_NAME>
            <![CDATA[CS_STUDENT]]>
        </TABLE_NAME>
        <STU_NAME>
            <![CDATA[SANPZ]]>
        </STU_NAME>
        <SQL_STATEMENT>
            <![CDATA[DELETE FROM CS_STUDENT WHERE STU_NAME = 'SANPZ']]>
        </SQL_STATEMENT>
    </row>
</rows>

python解析XML可用的类库或模块有xml、libxml2 、lxml 、xpath等

常用的第三方库对比

常用的有三个分别是:xml.etree.ElementTree、xml.dom.*、xml.sax.*

第三方库优点缺点
xml.etree.ElementTree它速度更快,消耗的内存更少
xml.dom.*她文档中所有元素保存在内存中的一个树结构里,利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件消耗内存
xml.sax.*一、对大型文件进行处理;二、只需要文件的部分内容,或者只需从文件中得到特定信息;三、想建立自己的对象模型的时候ython中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler

xml.etree.ElementTree

xml.etree.ElementTree在Python标准库中有两种实现:

一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。从Python 3.3开始ElementTree模块会自动寻找可用的C库来加快速度,所以只需要import xml.etree.ElementTree就可以了


import xml.etree.ElementTree as ET
xml_path = r'DATA_DELETE_SQL.XML'

try:
    # 打开xml文档
    tree = ET.parse(xml_path)
    # 获取root节点
    root = tree.getroot()
    print(root.tag)
    # 通过下标访问
    print(root[0][1].tag)
    print(root[0][1].text)
except:
    print('打不开这个xml')

# 获取根节点下的节点信息
for child in root:
   print(child.tag)
   print(child.text)

# 获取root节点下的所有 row 节点
for row in root.findall('row'):
   print(row.tag)
   # 子节点下 TABLE_NAME 节点
   table_name = row.find('TABLE_NAME').text
   # 子节点下属性的值<row TABLE_NAME = 'AAA'></row>
   table_name_value = row.get('TABLE_NAME')

# 修改xml,移除根节点下所有row节点的 ID节点(注意此移除仅在本次会话中生效,并未修改xml内容)
for row in root.findall('row'):
    id = row.find('ID')
    row.remove(id)
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐