前言
xml课的第三第四个作业都是用java编程来实现xml dom的一些转换, 因为自己没怎么学过java,因此和老师说了下想用python来实现第三第四个作业,下面就直接贴代码了
xml文档
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="1.xslt" rel="external nofollow" ?> <!doctype sys_info [ <!element sys_info (info+)> <!element info (sysdescr,sysuptime,syscontact,sysname)> <!element sysdescr (#pcdata)> <!element sysuptime (#pcdata)> <!element syscontact (#pcdata)> <!element sysname (#pcdata)> <!attlist info ip cdata #required> ]> <sys_info xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="1.xsd"> <info ip="192.168.1.1"> <sysdescr>x86-windows2000</sysdescr> <sysuptime>9 hours 42 minutes</sysuptime> <syscontact>zhangsan</syscontact> <sysname>computerzhang</sysname> </info> <info ip="192.168.1.3"> <sysdescr>router</sysdescr> <sysuptime>24 hours</sysuptime> <syscontact>ruijie</syscontact> <sysname>router2</sysname> </info> <info ip="192.168.2.1"> <sysdescr>router</sysdescr> <sysuptime>89 hours</sysuptime> <syscontact>cisco</syscontact> <sysname>router3</sysname> </info> </sys_info>
解析xml文档用的是python自带的xml库elementtree, 读取mysql可以安装mysqldb模块
apt-get install python-mysqldb
程序运行如下
root@lj /h/s/x/3# python 21.py -h usage: 21.py [-h] status positional arguments: status 0clar,1read,2insert
读取xml保存到数据库
root@lj /h/s/x/3# python 21.py 2 插入语句: insert into info values ('192.168.1.1','x86-windows2000','9 hours 42 minutes','zhangsan','computerzhang') 插入语句: insert into info values ('192.168.1.3','router','24 hours','ruijie','router2') 插入语句: insert into info values ('192.168.2.1','router','89 hours','cisco','router3') insert success!!!
读取数据库保存到xml文档
root@lj /h/s/x/3# python 21.py 1 +-------------+-----------------+--------------------+------------+---------------+ | ip地址 | sysdescr.0 | sysuptime.0 | syscontact | sysname.0 | +-------------+-----------------+--------------------+------------+---------------+ | 192.168.1.1 | x86-windows2000 | 9 hours 42 minutes | zhangsan | computerzhang | | 192.168.1.3 | router | 24 hours | ruijie | router2 | | 192.168.2.1 | router | 89 hours | cisco | router3 | +-------------+-----------------+--------------------+------------+---------------+ write into sys.xml...
建立数据库的sql文件:
-- mysql dump 10.16 distrib 10.1.21-mariadb, for debian-linux-gnu (x86_64) -- -- host: localhost database: localhost -- ------------------------------------------------------ -- server version 10.1.21-mariadb-5 /*!40101 set @old_character_set_client=@@character_set_client */; /*!40101 set @old_character_set_results=@@character_set_results */; /*!40101 set @old_collation_connection=@@collation_connection */; /*!40101 set names utf8mb4 */; /*!40103 set @old_time_zone=@@time_zone */; /*!40103 set time_zone='+00:00' */; /*!40014 set @old_unique_checks=@@unique_checks, unique_checks=0 */; /*!40014 set @old_foreign_key_checks=@@foreign_key_checks, foreign_key_checks=0 */; /*!40101 set @old_sql_mode=@@sql_mode, sql_mode='no_auto_value_on_zero' */; /*!40111 set @old_sql_notes=@@sql_notes, sql_notes=0 */; -- -- table structure for table `info` -- drop table if exists `info`; /*!40101 set @saved_cs_client = @@character_set_client */; /*!40101 set character_set_client = utf8 */; create table `info` ( `ip` char(15) not null, `sysdescr` varchar(20) default null, `sysuptime` varchar(40) default null, `syscontract` varchar(20) default null, `sysname` varchar(20) default null, primary key (`ip`) ) engine=innodb default charset=utf8mb4; /*!40101 set character_set_client = @saved_cs_client */; -- -- dumping data for table `info` -- lock tables `info` write; /*!40000 alter table `info` disable keys */; insert into `info` values ('192.168.1.1','x86-windows2000','9 hours 42 minutes','zhangsan','computerzhang'),('192.168.1.3','router','24 hours','ruijie','router2'),('192.168.2.1','router','89 hours','cisco','router3'); /*!40000 alter table `info` enable keys */; unlock tables; /*!40103 set time_zone=@old_time_zone */; /*!40101 set sql_mode=@old_sql_mode */; /*!40014 set foreign_key_checks=@old_foreign_key_checks */; /*!40014 set unique_checks=@old_unique_checks */; /*!40101 set character_set_client=@old_character_set_client */; /*!40101 set character_set_results=@old_character_set_results */; /*!40101 set collation_connection=@old_collation_connection */; /*!40111 set sql_notes=@old_sql_notes */; -- dump completed on 2017-03-23 15:36:31
下面是主要代码
#!/usr/bin/env python # -*- coding: utf-8 -*- # @date : 2017-03-23 14:47:39 # @author : 江sir (2461805286@qq.com) # @link : http://www.blogsir.com.cn # @version : $1.1 import sys import xml.etree.elementtree as et import mysqldb import argparse from prettytable import prettytable ''' 一个xml作业,自己用python实现了从xml读取到数据库,和从数据库读取到xml的功能 ''' def buildnewsxmlfile(data): root = et.element('sys_info')#创建sys_info根元素 # print help(et) info = et.subelement(root, "info",attrib={'ip':'%s'%data[0][0]})#创建四个二级元素 sysdescr = et.subelement(info,"sysdescr") sysuptime = et.subelement(info,"sysuptime") syscontact = et.subelement(info,"syscontact") sysname = et.subelement(info,"sysname") sysdescr.text = data[0][1] sysuptime.text = data[0][2] syscontact.text = data[0][3] sysname.text = data[0][4] info = et.subelement(root, "info",attrib={'ip':'%s'%data[1][0]}) sysdescr = et.subelement(info,"sysdescr") sysuptime = et.subelement(info,"sysuptime") syscontact = et.subelement(info,"syscontact") sysname = et.subelement(info,"sysname") sysdescr.text = data[1][1] sysuptime.text = data[1][2] syscontact.text = data[1][3] sysname.text = data[1][4] info = et.subelement(root, "info",attrib={'ip':'%s'%data[2][0]}) sysdescr = et.subelement(info,"sysdescr") sysuptime = et.subelement(info,"sysuptime") syscontact = et.subelement(info,"syscontact") sysname = et.subelement(info,"sysname") sysdescr.text = data[2][1] sysuptime.text = data[2][2] syscontact.text = data[2][3] sysname.text = data[2][4] print 'write into sys.xml...' tree = et.elementtree(root) tree.write("sys.xml") def xml_parser(): data = {} data_list = [] tree = et.parse('21.xml') root = tree.getroot()# 获取根元素 for info in root.findall('info'): #查找所有info元素 for child in info: #对每个info元素遍历属性和子节点 data ['ip']= info.attrib['ip'] data[child.tag] = child.text # print data.values() data_list.append(data.values()) # print data_list return data_list def get_mysql(): conn = mysqldb.connect('localhost','root','root','sys_info2',charset='utf8') cursor = conn.cursor() cursor.execute('select * from info'); result = cursor.fetchall() if not result: print 'please insert the database first' sys.exit() x = prettytable(['ip地址','sysdescr.0','sysuptime.0','syscontact','sysname.0']) for i in result: x.add_row(i) print x # print result return result def set_mysql(data): conn = mysqldb.connect('localhost','root','root','sys_info2',charset='utf8') cursor = conn.cursor() for i in data: # print tuple(i) sysname,ip,sysuptime,sysdescr,syscontact = tuple(i) sql = "insert into info values ('%s','%s','%s','%s','%s')"%(ip,sysdescr,sysuptime,syscontact,sysname) print '插入语句:',sql try: cursor.execute(sql) except: print 'please clear the database' sys.exit() print 'insert success!!!' conn.commit() conn.close() def clear_mysql(): conn = mysqldb.connect('localhost','root','root','sys_info2',charset='utf8') cursor = conn.cursor() cursor.execute('delete from info') conn.commit() conn.close() def main(): parser = argparse.argumentparser() parser.add_argument('status',type=int,help="0clar,1read,2insert") arg = parser.parse_args() # print arg status = arg.status if status == 1: data = get_mysql() buildnewsxmlfile(data) elif status == 2: data = xml_parser() set_mysql(data) elif status == 0: clear_mysql() else: print 'usage %s [0|1|2]'%sys.argv[0] if name == 'main': main()
第四个作业是web编程,用python的flask框架即可快速实现一个xml文档的显示,文件过多,就不贴了
总结
以上就是python如何实现xml与数据库读取转换的示例代码分享的详细内容。
