python再学习3(xml)

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

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
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值