现在的位置: 首页 > 综合 > 正文

python再学习3(xml)

2017年12月07日 ⁄ 综合 ⁄ 共 6119字 ⁄ 字号 评论关闭

一、首先需要获取当前脚本路径,代码直接网上来

import sys,os

#获取脚本文件的当前路径
def cur_file_dir():
     #获取脚本路径
     path = sys.path[0]
     #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
if os.path.isdir(path):
    return path
elif os.path.isfile(path):
    return os.path.dirname(path)

二 、xml.dom 解析XML的API描述

minidom.parse(filename)

加载读取XML文件

doc.documentElement

获取XML文档对象

node.getAttribute(AttributeName)

获取XML节点属性值

node.getElementsByTagName(TagName)

获取XML节点对象集合

node.childNodes #返回子节点列表。

node.childNodes[index].nodeValue

获取XML节点值



node.firstChild

#访问第一个节点。等价于pagexml.childNodes[0]

 

doc = minidom.parse(filename)

doc.toxml('UTF-8')

返回Node节点的xml表示的文本



Node.attributes["id"]

a.name #就是上面的 "id"

a.value #属性的值 

访问元素属性

代码示例:

创建一个数据文件user.xml,在脚本目录下建个data目录,将此文件放置于data目录中

<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1000001">
        <username>Admin</username>
        <email>admin@live.cn</email>
        <age>23</age>
        <sex>男</sex>
    </user>
    <user id="1000002">
        <username>Admin2</username>
        <email>admin2@live.cn</email>
        <age>22</age>
        <sex>男</sex>
    </user>
    <user id="1000003">
        <username>Admin3</username>
        <email>admin3@live.cn</email>
        <age>27</age>
        <sex>男</sex>
    </user>
    <user id="1000004">
        <username>Admin4</username>
        <email>admin4@live.cn</email>
        <age>25</age>
        <sex>女</sex>
    </user>
    <user id="1000005">
        <username>Admin5</username>
        <email>admin5@live.cn</email>
        <age>20</age>
        <sex>男</sex>
    </user>
    <user id="1000006">
        <username>Admin6</username>
        <email>admin6@live.cn</email>
        <age>23</age>
        <sex>女</sex>
    </user>
</users>

doxml.py代码:

# -*- coding:utf-8 -*-
"""
* User: lhj588
* Date: 11-11-9
* Time: 13:20
* Desc:
"""
import sys,os
from  xml.dom import  minidom


#获取脚本文件的当前路径
def cur_file_dir():
    #获取脚本路径
    path = sys.path[0]
    #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
    if os.path.isdir(path):
        return path
    elif os.path.isfile(path):
        return os.path.dirname(path)

def get_attrvalue(node, attrname):
    return node.getAttribute(attrname) if node else ''

def get_nodevalue(node, index = 0):
    return node.childNodes[index].nodeValue if node else ''

def get_xmlnode(node,name):
    return node.getElementsByTagName(name) if node else []

def xml_to_string(filename='user.xml'):
    doc = minidom.parse(filename)
    return doc.toxml()

def get_xml_data(filename='user.xml'):
    doc = minidom.parse(filename) 
    root = doc.documentElement

    user_nodes = get_xmlnode(root,'user')
    user_list=[]
    for node in user_nodes: 
        user_id = get_attrvalue(node,'id') 
        node_name = get_xmlnode(node,'username')
        node_email = get_xmlnode(node,'email')
        node_age = get_xmlnode(node,'age')
        node_sex = get_xmlnode(node,'sex')

        user_name =get_nodevalue(node_name[0])
        user_email = get_nodevalue(node_email[0])
        user_age = int(get_nodevalue(node_age[0]))
        user_sex = get_nodevalue(node_sex[0])
        user = {}
        user['id'] , user['username'] , user['email'] , user['age'] , user['sex'] = (
            int(user_id), user_name , user_email , user_age , user_sex
        )
        user_list.append(user)
    return user_list

def test_xmltostring(filename):
    filename = cur_file_dir() + "\\" + filename
    print (xml_to_string(filename))

def test_laod_xml(filename):
    filename = cur_file_dir() + "\\" + filename
    user_list = get_xml_data(filename)
    for user in user_list :
        #print user['sex']
        print ('-----------------------------------------------------')
        if user:
            user_str='编   号:%d\n用户名:%s\n性   别:%s\n年   龄:%s\n邮   箱:%s\n ' % (int(user['id']) , user['username'], user['sex'] , user['age'] , user['email'])
            print (user_str)
            print ('=====================================================')

if __name__ == "__main__":
    test_xmltostring("data\\user.xml")
    test_laod_xml("data\\user.xml")

生成结果如下:

<?xml version="1.0" ?><users>
    <user id="1000001">
        <username>Admin</username>
        <email>admin@live.cn</email>
        <age>23</age>
        <sex>男</sex>
    </user>
    <user id="1000002">
        <username>Admin2</username>
        <email>admin2@live.cn</email>
        <age>22</age>
        <sex>男</sex>
    </user>
    <user id="1000003">
        <username>Admin3</username>
        <email>admin3@live.cn</email>
        <age>27</age>
        <sex>男</sex>
    </user>
    <user id="1000004">
        <username>Admin4</username>
        <email>admin4@live.cn</email>
        <age>25</age>
        <sex>女</sex>
    </user>
    <user id="1000005">
        <username>Admin5</username>
        <email>admin5@live.cn</email>
        <age>20</age>
        <sex>男</sex>
    </user>
    <user id="1000006">
        <username>Admin6</username>
        <email>admin6@live.cn</email>
        <age>23</age>
        <sex>女</sex>
    </user>
</users>
-----------------------------------------------------
编   号:1000001
用户名:Admin
性   别:男
年   龄:23
邮   箱:admin@live.cn
 
=====================================================
-----------------------------------------------------
编   号:1000002
用户名:Admin2
性   别:男
年   龄:22
邮   箱:admin2@live.cn
 
=====================================================
-----------------------------------------------------
编   号:1000003
用户名:Admin3
性   别:男
年   龄:27
邮   箱:admin3@live.cn
 
=====================================================
-----------------------------------------------------
编   号:1000004
用户名:Admin4
性   别:女
年   龄:25
邮   箱:admin4@live.cn
 
=====================================================
-----------------------------------------------------
编   号:1000005
用户名:Admin5
性   别:男
年   龄:20
邮   箱:admin5@live.cn
 
=====================================================
-----------------------------------------------------
编   号:1000006
用户名:Admin6
性   别:女
年   龄:23
邮   箱:admin6@live.cn
 
=====================================================

python3.4通过。

增加写入并读出的代码:

def test_GenerateXml(filename):
    import xml.dom.minidom
    dom = GenerateXml();
    filename = cur_file_dir() + "\\" + filename
    f= open(filename, 'w', encoding='utf-8')
    dom.writexml(f, addindent='  ', newl='\n',encoding='utf-8')
    f.close()      
    

def test_load_GenerateXml(filename):
    filename = cur_file_dir() + "\\" + filename
    doc = minidom.parse(filename)
    root = doc.documentElement
    user_nodes = get_xmlnode(root, 'employee')
    user_list=[]
    for node in user_nodes:
        node_name = get_xmlnode(node, 'name')
        node_age = get_xmlnode(node, 'age')
        user_name =get_nodevalue(node_name[0])
        user_age = get_nodevalue(node_age[0])        
        user = {}
        user['name'], user['age'] = (user_name, int(user_age))
        user_list.append(user)
        
    for user in user_list:
        print ('------------------------------------------------------------------')
        if user:
            user_str = 'name :%s, age: %d' % (user['name'], int(user['age']))
            print (user_str)
            print('=============================')
        
        
def GenerateXml():
    import xml.dom.minidom
    impl = xml.dom.minidom.getDOMImplementation()
    dom = impl.createDocument(None, 'employees', None)
    root = dom.documentElement  
    employee = dom.createElement('employee')
    root.appendChild(employee)
    
    nameE=dom.createElement('name')
    nameT=dom.createTextNode('好linux')
    nameE.appendChild(nameT)
    employee.appendChild(nameE)
    
    ageE=dom.createElement('age')
    ageT=dom.createTextNode('30')
    ageE.appendChild(ageT)
    employee.appendChild(ageE)
    return dom
    

抱歉!评论已关闭.