美文网首页
PYTHON XML解析-DOM方式

PYTHON XML解析-DOM方式

作者: MoonMonsterss | 来源:发表于2018-09-01 22:56 被阅读20次

    python用来操作XML格式文档有两种方式,一种是DOM方式,将文档读取到内存中操作,然后导出到磁盘中,优点是操作方便,适合较小的文件,如果文档很大的话,那么将会很占内存;另外一种是SAX方式,采用的是流操作的模式,边读取边解析,缺点是不方便解析,需要自己处理相关事件,但相比于DOM方式,优点也很明显就是不占内存。

    1.xml示例文件

    <?xml version='1.0' encoding='UTF-8' ?>
    <users>
        <user id='1'>
            <username>admin</username>
            <email>admin@qq.com</email>
            <age>23</age>
            <address>
                <tag>xx通讯公司</tag>
            </address>
        </user>
        <user id='2'>
            <username>user</username>
            <email>user@qq.com</email>
            <age>22</age>
        </user>
    </users>
    

    2.解析XML文件

    import xml.dom.minidom as XmlDocument
    
    # 加载xml文件到内存中
    doc = XmlDocument.parse('test_xml.xml')
    # 获取根节点信息
    xUsers = doc.getElementsByTagName('users')
    # 打印的结果是只有一个数据的列表   xUsers = [<DOM Element: users at 0x2aee940>]
    print('xUsers =',xUsers)
    # 判断文件中是否存在users节点
    if xUsers and len(xUsers) > 0:
        # 根据tag名,从users中获取所有的tag=user的节点列表
        # 从xUsers的打印信息可以看出,通过getElementsByTagName获取到的数据都是列表,所以需要使用xUsers[0]
        xUserList = xUsers[0].getElementsByTagName('user')
        # 打印结果: xUserList = [<DOM Element: user at 0x2aeef80>, <DOM Element: user at 0x2dde1c0>]
        # users下有多个user节点
        print('xUserList =',xUserList)
        # 循环遍历
        for user in xUserList:
            # id是包含在tag信息中的属性<user id='1'>,所以使用attributes获取
            id = user.attributes['id'].value
            # 打印结果: id = 1
            print('id =',id)
            # xUsername是一个列表
            xUsername = user.getElementsByTagName('username')
            if xUsername and len(xUsername) > 0:
                # 获取列表中的第一个数据
                # <username>admin</username>
                # 数据是包含在tag中的内容,所以使用firstChild.data获取
                username = xUsername[0].firstChild.data
                # username = admin
                print('username =',username)
    
            xEmail = user.getElementsByTagName('email')
            if xEmail and len(xEmail) > 0:
                email = xEmail[0].firstChild.data
                print('email =',email)
    
            xAge = user.getElementsByTagName('age')
            if xAge and len(xAge) > 0:
                age = xAge[0].firstChild.data
                print('age =',age)
    
            # <address><tag>xx通讯公司</tag></address>
            # xAddress是一个列表
            xAddress = user.getElementsByTagName('address')
            if xAddress and len(xAddress) > 0:
                # xAddress[0]是address这个tag
                # 从address这个标签中通过getElementsByTagName获取的数据也是列表
                xTag = xAddress[0].getElementsByTagName('tag')
                if xTag and len(xTag) > 0:
                    # 不再包含子标签,直接通过firstChild.data获取数据
                    tag = xTag[0].firstChild.data
                    print(tag)
    

    小结:
    节点类型:
    ELEMENT_NODE(元素节点):1.中的<users></users> 或者 <address></address>等
    TEXT_NODE(标签中的内容):1.中的标签的内容admin@qq.com
    ATTRIBUTE_NODE(标签属性):1.中的id="1"

    取值方式:
    ELEMENT_NODE:xxx.getElementsByTagName('tag_name') 拿到的值是一个列表,xxx是父标签
    TEXT_NODE:xxx.firstChild.data 从标签内容中取出值,但一般xxx都是通过getElementsByTagName获取到的,所以会写成xxx[0]
    ATTRIBUTE_NODE:xxx.attributes['id'].value,xxx就是通过getElementsByTagName获取到的标签

    所以总的来说,不管有多少层嵌套标签,取值方式就三种,1.如果获取标签信息,就使用xxx.getElementsByTagName('xx'),2.如果获取属性信息,就用xxx.attributes['xx'].value,3.如果获取标签内容,就用firstChild.data

    3.生成XML文件

    import xml.dom.minidom as XmlDocument
    
    # 定义XML文档对象
    doc = XmlDocument.Document()
    
    # 创建根节点
    xUsers = doc.createElement('users')
    doc.appendChild(xUsers)
    
    # 创建一个节点,命名为user
    xUser = doc.createElement('user')
    # 将该节点设置为xUsers的子节点
    xUsers.appendChild(xUser)
    
    # 给标签添加属性
    xUser.attributes['id'] = '1'
    
    # 创建一个新的节点,命名为username
    username = doc.createElement('username')
    # 给标签添加内容数据
    # 添加数据需要使用doc.createTextNode函数
    username.appendChild(doc.createTextNode('MoonMonsters'))
    # 将其设置为xUser节点的子节点
    xUser.appendChild(username)
    
    # 重复以上内容
    email = doc.createElement('email')
    email.appendChild(doc.createTextNode('moonmonster@qq.com'))
    xUser.appendChild(email)
    
    age = doc.createElement('age')
    age.appendChild(doc.createTextNode('20'))
    xUser.appendChild(age)
    
    with open('test.xml', 'wb') as fp:
        fp.write(doc.toxml(encoding='utf-8'))
    

    最后生成的文件:

    <?xml version="1.0" encoding="utf-8"?>
    <users>
        <user id="1">
            <username>MoonMonsters</username>
            <email>moonmonster@qq.com</email>
            <age>20</age>
        </user>
    </users>
    

    相关文章

      网友评论

          本文标题:PYTHON XML解析-DOM方式

          本文链接:https://www.haomeiwen.com/subject/fukpwftx.html