亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python通過DOM和SAX方式解析XML的應用實例分享

2020-01-04 17:57:24
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python通過DOM和SAX方式解析XML的應用實例分享,針對這兩種解析方式Python都有相關的模塊可供使用,需要的朋友可以參考下

XML.DOM

需求

有一個表,里面數據量比較大,每天一更新,其字段可以通過xml配置文件進行配置,即,可能每次建表的字段不一樣。

上游跑時會根據配置從源文件中提取,到入庫這一步需要根據配置進行建表。

解決

寫了一個簡單的xml,配置需要字段及類型

上游讀取到對應的數據

入庫這一步,先把原表刪除,根據配置建新表

XML文件

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!-- 表名 ,數據庫名 可靈活配置插入哪個庫哪個表 --> 
  3. <table name="top_query" db_name="evaluting_sys"
  4. <!-- 非業務主鍵,自增長,可配名,其他 INTEGER UNSIGNED AUTO_INCREMENT --> 
  5. <primary_key> 
  6. <name>id</name> 
  7. </primary_key> 
  8. <!-- 字段開始 --> 
  9. <field> 
  10. <name>query</name> 
  11. <type>varchar(200)</type> 
  12. <is_index>false</is_index> 
  13. <description>query</description> 
  14. </field> 
  15. <field> 
  16. <name>pv</name> 
  17. <type>integer</type> 
  18. <is_index>false</is_index> 
  19. <description>pv</description> 
  20. </field> 
  21. <field> 
  22. <name>avg_money</name> 
  23. <type>integer</type> 
  24. <is_index>false</is_index> 
  25. <description></description> 
  26. </field> 
  27. <!-- 字段配置結束 --> 
  28. </table> 

處理腳本

 

 
  1. #!/usr/bin/python 
  2. # -*- coding:utf-8 -*- 
  3. #author: wklken 
  4. #desc: use to read db xml config. 
  5. #----------------------- 
  6. #2012-02-18 created 
  7. #---------------------- 
  8.  
  9. import sys,os 
  10. from xml.dom import minidom, Node 
  11.  
  12. def read_dbconfig_xml(xml_file_path): 
  13. content = {} 
  14.  
  15. root = minidom.parse(xml_file_path) 
  16. table = root.getElementsByTagName("table")[0] 
  17.  
  18. #read dbname and table name. 
  19. table_name = table.getAttribute("name"
  20. db_name = table.getAttribute("db_name"
  21.  
  22. if len(table_name) > 0 and len(db_name) > 0: 
  23. db_sql = "create database if not exists `" + db_name +"`; use " + db_name + ";" 
  24. table_drop_sql = "drop " + table_name + " if exists " + table_name + ";" 
  25. content.update({"db_sql" : db_sql}) 
  26. content.update({"table_sql" : table_drop_sql }) 
  27. else
  28. print "Error:attribute is not define well! db_name=" + db_name + " ;table_name=" + table_name 
  29. sys.exit(1) 
  30. #print table_name, db_name 
  31.  
  32. table_create_sql = "create table " + table_name +"(" 
  33.  
  34. #read primary cell 
  35. primary_key = table.getElementsByTagName("primary_key")[0] 
  36. primary_key_name = primary_key.getElementsByTagName("name")[0].childNodes[0].nodeValue 
  37.  
  38. table_create_sql += primary_key_name + " INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY," 
  39.  
  40. #print primary_key.toxml() 
  41. #read ordernary field 
  42. fields = table.getElementsByTagName("field"
  43. f_index = 0 
  44. for field in fields: 
  45. f_index += 1 
  46. name = field.getElementsByTagName("name")[0].childNodes[0].nodeValue 
  47. type = field.getElementsByTagName("type")[0].childNodes[0].nodeValue 
  48. table_create_sql += name + " " + type 
  49. if f_index != len(fields): 
  50. table_create_sql += "," 
  51. is_index = field.getElementsByTagName("is_index")[0].childNodes[0].nodeValue 
  52.  
  53. table_create_sql += ");" 
  54. content.update({"table_create_sql" : table_create_sql}) 
  55. #character set latin1 collate latin1_danish_ci; 
  56. print content 
  57.  
  58.  
  59. if __name__ == "__main__"
  60. read_dbconfig_xml(sys.argv[1]) 

涉及方法

root = minidom.parse(xml_file_path) 獲取dom對象

root.getElementsByTagName("table") 根據tag獲取節點列表

table.getAttribute("name") 獲取屬性

primary_key.getElementsByTagName("name")[0].childNodes[0].nodeValue 獲取子節點的值(id 得到id)

SAX

需求

讀取xml數據文件,文件較大,需要實時處理插入到數據庫

xml文檔

 

 
  1. <PERSONS> 
  2. <person> 
  3. <id>100000</id> 
  4. <sex>男</sex> 
  5. <address>北京,海淀區</address> 
  6. <fansNum>437</fansNum> 
  7. <summary>1989</summary> 
  8. <wbNum>333</wbNum> 
  9. <gzNum>242</gzNum> 
  10. <blog>null</blog> 
  11. <edu>大學</edu> 
  12. <work></work> 
  13. <renZh>1</renZh> 
  14. <brithday>2月14日</brithday> 
  15. </person> 
  16. </PERSONS> 

處理

sax處理時并不會像dom一樣可以以類似節點的維度進行讀取,它只有 開始標簽 內容 結束標簽 之分

處理思想是:通過一個handler,對開始標簽,內容,結束標簽各有一個處理函數

代碼及注解

person 處理類

 

 
  1. from xml.sax import handler,parseString 
  2. class PersonHandler(handler.ContentHandler): 
  3. def __init__(self, db_ops): 
  4. #db op obj 
  5. self.db_ops = db_ops 
  6. #存儲一個person的map 
  7. self.person = {} 
  8. #當前的tag 
  9. self.current_tag = "" 
  10. #是否是tag之間的內容 ,目的拿到tag間內容,不受空白的干擾 
  11. self.in_quote = 0 
  12. #開始,清空map 
  13. def startElement(self, name, attr): 
  14. #以person,清空map 
  15. if name == "person"
  16. self.person = {} 
  17. #記錄 狀態 
  18. self.current_tag = name 
  19. self.in_quote = 1 
  20. #結束,插入數據庫 
  21. def endElement(self, name): 
  22. #以person結尾 代表讀取一個person的信息結束 
  23. if name == "person"
  24. #do something 
  25. in_fields = tuple([ ('"' + self.person.get(i,"") + '"') for i in fields ]) 
  26. print in_sql % in_fields 
  27. db_ops.insert( in_sql%(in_fields)) 
  28. #處理 
  29. self.in_quote = 0 
  30. def characters(self, content): 
  31. #若是在tag之間的內容,更新到map中 
  32. if self.in_quote: 
  33. self.person.update({self.current_tag: content}) 

加上入庫的完整代碼

 

 
  1. #!/usr/bin/python 
  2. # -*- coding:utf-8 -*- 
  3. #parse_person.py 
  4. #version : 0.1 
  5. #author : wukunliang@163.com 
  6. #desc : parse person.xml and out sql 
  7.  
  8.  
  9. import sys,os 
  10. import MySQLdb 
  11.  
  12. reload(sys) 
  13. sys.setdefaultencoding('utf-8'
  14.  
  15. in_sql = "insert into person(id,sex,address,fansNum,summary,wbNum,gzNum,blog,edu,work,renZh,brithday) values(%s, %s, %s, %s, %s, %s, 
  16. %s, %s, %s, %s, %s, %s)" 
  17.  
  18. fields = ("id","sex","address","fansNum","summary","wbNum","gzNum","blog","edu","work","renZh","brithday"
  19.  
  20. #數據庫方法 
  21. class Db_Connect: 
  22. def __init__(self, db_host, user, pwd, db_name, charset="utf8", use_unicode = True): 
  23. print "init begin" 
  24. print db_host, user, pwd, db_name, charset , use_unicode 
  25. self.conn = MySQLdb.Connection(db_host, user, pwd, db_name, charset=charset , use_unicode=use_unicode) 
  26. print "init end" 
  27.  
  28. def insert(self, sql): 
  29. try
  30. n = self.conn.cursor().execute(sql) 
  31. return n 
  32. except MySQLdb.Warning, e: 
  33. print "Error: execute sql '",sql,"' failed" 
  34.  
  35. def close(self): 
  36. self.conn.close() 
  37.  
  38. #person 處理類 
  39. from xml.sax import handler,parseString 
  40. class PersonHandler(handler.ContentHandler): 
  41. def __init__(self, db_ops): 
  42. #db op obj 
  43. self.db_ops = db_ops 
  44. #存儲一個person的map 
  45. self.person = {} 
  46. #當前的tag 
  47. self.current_tag = "" 
  48. #是否是tag之間的內容 
  49. self.in_quote = 0 
  50. #開始,清空map 
  51. def startElement(self, name, attr): 
  52. #以person,清空map 
  53. if name == "person"
  54. self.person = {} 
  55. #記錄 狀態 
  56. self.current_tag = name 
  57. self.in_quote = 1 
  58. #結束,插入數據庫 
  59. def endElement(self, name): 
  60. #以person結尾 代表讀取一個person的信息結束 
  61. if name == "person"
  62. #do something 
  63. in_fields = tuple([ ('"' + self.person.get(i,"") + '"') for i in fields ]) 
  64. print in_sql % in_fields 
  65. db_ops.insert( in_sql%(in_fields)) 
  66. #處理 
  67. self.in_quote = 0 
  68. def characters(self, content): 
  69. #若是在tag之間的內容,更新到map中 
  70. if self.in_quote: 
  71. self.person.update({self.current_tag: content}) 
  72.  
  73. if __name__ == "__main__"
  74. f = open("./person.xml"
  75. #如果源文件gbk 轉碼 若是utf-8,去掉decode.encode 
  76. db_ops = Db_Connect("127.0.0.1""root""root""test"
  77. parseString(f.read().decode("gbk").encode("utf-8"), PersonHandler(db_ops)) 
  78. f.close() 
  79. db_ops.close() 

平時拿python來分析數據,工具腳本還有hadoop streamming,但是用的面和深度實在欠缺 只能說道行還淺,需要多多實踐

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性色av一区二区三区红粉影视| 欧美激情二区三区| 日韩欧美福利视频| 日韩欧美在线一区| 国产精品爽黄69| 亚洲精品电影久久久| 91精品在线观看视频| 日韩免费av片在线观看| 欧美黄色小视频| 亚洲人成网站在线播| 日韩在线观看免费全| 岛国av一区二区| 国产成人一区二区三区电影| 性色av一区二区三区免费| 在线亚洲欧美视频| 亚洲美女www午夜| 日韩av网址在线观看| 欧美最近摘花xxxx摘花| 久久久久久久久久久亚洲| 久久亚洲成人精品| 日本精品久久久久影院| 欧美日韩国产一区中文午夜| 91在线免费网站| 亚洲欧洲在线播放| 欧美美女操人视频| 国产精品久久久久久久电影| 爽爽爽爽爽爽爽成人免费观看| 91欧美日韩一区| 国产精品久久久久福利| 国产一区二区黑人欧美xxxx| 久久亚洲国产精品成人av秋霞| 亚洲在线免费视频| 国产精品久久久久aaaa九色| 精品久久久久久久大神国产| 国产精品成人aaaaa网站| 国语自产偷拍精品视频偷| 亚洲精品中文字幕女同| 亚洲精品99久久久久| 亚洲性猛交xxxxwww| 国产精品香蕉av| 一色桃子一区二区| 夜夜躁日日躁狠狠久久88av| 尤物tv国产一区| 最新91在线视频| 亚洲第一网站免费视频| 成人深夜直播免费观看| 欧美日韩精品在线视频| 久久久久久久亚洲精品| 国产精品第七影院| 国产精品一区二区久久久久| 亚洲成在人线av| 亚洲乱亚洲乱妇无码| 日韩欧美国产成人| 91中文精品字幕在线视频| 国产精品黄页免费高清在线观看| 国产成人精品综合久久久| 不卡av电影院| 欧美最猛性xxxx| 精品国产欧美一区二区五十路| 韩日精品中文字幕| 精品少妇v888av| 欧美亚洲日本网站| 日韩精品亚洲视频| 777国产偷窥盗摄精品视频| 国产视频在线观看一区二区| 国内精品在线一区| 亚洲国产日韩欧美在线动漫| 亚洲最大的免费| 久久视频在线视频| 国产热re99久久6国产精品| 在线中文字幕日韩| 色999日韩欧美国产| 亚洲视频专区在线| 欧美黄色性视频| 伊人久久免费视频| 久久久久久一区二区三区| 欧美性猛交xxxx乱大交极品| 亚洲黄色www网站| 亚洲国产欧美自拍| 久久精品视频中文字幕| 成人羞羞国产免费| 深夜福利一区二区| 黄色一区二区在线| 欧美三级欧美成人高清www| 久久韩剧网电视剧| 91视频国产一区| 亚洲缚视频在线观看| 久久久久女教师免费一区| 伊人久久久久久久久久| 欧美大片免费观看在线观看网站推荐| 欧美日韩国产成人在线| 福利视频导航一区| 亚洲一区国产精品| 91精品在线影院| 日韩一级裸体免费视频| 91精品国产亚洲| 久久影院资源站| 日韩成人网免费视频| 精品精品国产国产自在线| 欧美日韩一区免费| 在线成人中文字幕| 亚洲一区二区久久久久久| 成人免费福利视频| 国产一区二区美女视频| 日韩av在线影院| 国产欧美在线视频| 亚洲欧美制服第一页| 日韩亚洲欧美成人| 国产91精品黑色丝袜高跟鞋| 国产一区欧美二区三区| 91久久精品国产| 成人免费视频在线观看超级碰| 国产精品十八以下禁看| 亚洲性视频网站| 中文字幕一区二区精品| 久久久av亚洲男天堂| 亚洲成人av资源网| 中文字幕在线观看亚洲| 久久伊人精品一区二区三区| 亚洲一区二区福利| 九九视频直播综合网| 国模视频一区二区| 91影视免费在线观看| 日本欧美爱爱爱| 97视频在线观看网址| 成人美女av在线直播| 91精品国产91久久久久久最新| 国产91在线视频| 久久精品在线视频| 日韩欧美成人精品| 色综合久综合久久综合久鬼88| 中文字幕精品一区久久久久| 久久国产精彩视频| 国产成人久久久| 欧美日韩一二三四五区| 欧美午夜精品久久久久久久| 成人在线视频福利| 国产免费成人av| 欧美黑人巨大精品一区二区| 国产精品色婷婷视频| 久久人91精品久久久久久不卡| 久久亚洲精品中文字幕冲田杏梨| 欧美丰满老妇厨房牲生活| 亚洲视频在线观看免费| 国产亚洲精品一区二区| 日韩欧美综合在线视频| 日本精品视频网站| 国产精品一区专区欧美日韩| 亚洲欧美国产一区二区三区| 国产成人精品视频| 在线视频欧美日韩精品| 中文字幕av一区中文字幕天堂| 久久综合伊人77777尤物| 亚洲大尺度美女在线| 91久久嫩草影院一区二区| 亚洲综合大片69999| 97热在线精品视频在线观看| 亚洲区中文字幕| 亚洲一区二区三区在线视频| 国产日韩欧美综合| 国产精品色婷婷视频| 亚洲欧美一区二区三区在线| 尤物九九久久国产精品的特点| 欧美精品video|