>ä½ ä»¬è¦é 主常常åä¹ï¼æå说ï¼ä½ 们è¦åä¹ãå½å«ä¼äººç¥éä½ ä»¬è°¦è®©çå¿ã主已ç»è¿äºãåºå½ä¸æ æèï¼åªè¦å¡äºèç祷åãç¥æ±åæè°¢ï¼å°ä½ 们æè¦çåè¯ç¥ãç¥æèµåºäººæå¤çå¹³å®ï¼æ¯å¨åºç£è¶ç¨£éé¢ä¿å®ä½ 们çå¿ææå¿µã(PHILIPPIANS 4:4-7)
#æ ååº(7)
##XML
XMLå¨è½¯ä»¶é¢åç¨éé常广æ³ï¼æå人æ°ï¼
>âå½ XMLï¼æ©å±æ è®°è¯è¨ï¼äº 1998 å¹´ 2 æè¢«å¼å
¥è½¯ä»¶å·¥ä¸çæ¶ï¼å®ç»æ´ä¸ªè¡ä¸å¸¦æ¥äºä¸åºé£æ´ãæå²ä»¥æ¥ç¬¬ä¸æ¬¡ï¼è¿ä¸ªä¸çæ¥æäºä¸ç§ç¨æ¥ç»æåææ¡£åæ°æ®çéç¨ä¸éåºæ§å¼ºçæ ¼å¼ï¼å®ä¸ä»
ä»
å¯ä»¥ç¨äº WEBï¼èä¸å¯ä»¥è¢«ç¨äºä»»ä½å°æ¹ãâ
>---ãDesigning With Web Standards Second Editionã, Jeffrey Zeldman
妿è¦å¯¹XMLåä¸ä¸ªå®ä¹å¼ç说æï¼å°±ä¸å¾ä¸å¼ç¨w3schooléé¢ç®æ´èæå¿«ç说æï¼
- XML æå¯æ©å±æ è®°è¯è¨ï¼EXtensible Markup Languageï¼
- XML æ¯ä¸ç§æ è®°è¯è¨ï¼å¾ç±»ä¼¼ HTML
- XML çè®¾è®¡å®æ¨æ¯ä¼ è¾æ°æ®ï¼èéæ¾ç¤ºæ°æ®
- XML æ ç¾æ²¡æè¢«é¢å®ä¹ãæ¨éè¦èªè¡å®ä¹æ ç¾ã
- XML 被设计为å
·æèªææè¿°æ§ã
- XML æ¯ W3C çæ¨èæ å
å¦æè¯»è
è¦è¯¦ç»äºè§£åå¦ä¹ XMLï¼å¯ä»¥é
读[w3schoolçæç¨](http://www.w3school.com.cn/xml/xml_intro.asp)
XMLçéè¦å¨äºå®æ¯ç¨æ¥ä¼ è¾æ°æ®çï¼å æ¤ï¼ç¹å«æ¯å¨webç¼ç¨ä¸ï¼ç»å¸¸è¦ç¨å°çãæäºå®è®©æ°æ®ä¼ è¾åå¾ç®åäºãè¿ä¹éè¦ï¼Pythonå½ç¶æ¯æã
ä¸è¬æ¥è®²ï¼ä¸ä¸ªå¼äººå
³æ³¨çä¸è¥¿ï¼æ»ä¼æå¾å¤äººä»ä¸åä¾§é¢å»ç ç©¶ãå¨ç¼ç¨è¯è¨ä¸ä¹æ¯å¦æ¤ï¼æä»¥ï¼å¯¹XMLè¿ä¸ªææå¼çä¸è¥¿ï¼Pythonæä¾äºå¤ç§æ¨¡åæ¥å¤çã
- xml.dom.* 模åï¼Document Object Modelãéåç¨äºå¤ç DOM APIãå®è½å¤å°XMLæ°æ®å¨å
åä¸è§£ææä¸ä¸ªæ ï¼ç¶åéè¿å¯¹æ çæä½æ¥æä½XMLã使¯ï¼è¿ç§æ¹å¼ç±äºå°XMLæ°æ®æ å°å°å
åä¸çæ ï¼å¯¼è´æ¯è¾æ
¢ï¼ä¸æ¶èæ´å¤å
åã
- xml.sax.* 模åï¼simple API for XMLãç±äºSAX以æµå¼è¯»åXMLæä»¶ï¼ä»èé度è¾å¿«ï¼åå°å ç¨å
åï¼ä½æ¯æä½ä¸ç¨å¤æï¼éè¦ç¨æ·å®ç°åè°å½æ°ã
- xml.parser.expatï¼æ¯ä¸ä¸ªç´æ¥çï¼ä½çº§ä¸ç¹çåºäº C ç expat çè¯æ³åæå¨ã expatæ¥å£åºäºäºä»¶åé¦ï¼æç¹å SAX ä½åä¸å¤ªåï¼å 为å®çæ¥å£å¹¶ä¸æ¯å®å
¨è§èäº expat åºçã
- xml.etree.ElementTree (以ä¸ç®ç§° ET)ï¼å
ç´ æ ã宿ä¾äºè½»é级çPythonå¼çAPIï¼ç¸å¯¹äºDOMï¼ETå¿«äºå¾å¤
ï¼è䏿å¾å¤ä»¤äººææ¦çAPIå¯ä»¥ä½¿ç¨ï¼ç¸å¯¹äºSAXï¼ET乿ET.iterparseæä¾äº âå¨ç©ºä¸â çå¤çæ¹å¼ï¼æ²¡æå¿
è¦å è½½æ´ä¸ªææ¡£å°å
åï¼èçå
åãETçæ§è½çå¹³åå¼åSAXå·®ä¸å¤ï¼ä½æ¯APIçæçæ´é«ä¸ç¹èä¸ä½¿ç¨èµ·æ¥å¾æ¹ä¾¿ã
æä»¥ï¼æç¨`xml.etree.ElementTree`ã
`ElementTree`卿 ååºä¸æä¸¤ç§å®ç°ãä¸ç§æ¯çº¯Pythonå®ç°ï¼`xml.etree.ElementTree` ï¼å¦å¤ä¸ç§æ¯é度快ä¸ç¹ï¼`xml.etree.cElementTree` ã
å¦æè¯»è
使ç¨çæ¯Python 2ï¼å¯ä»¥åè¿æ ·å¼å
¥æ¨¡åï¼
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
妿æ¯Python 3以ä¸ï¼å°±æ²¡æè¿ä¸ªå¿
è¦äºï¼åªéè¦ä¸å¥è¯`import xml.etree.ElementTree as ET`å³å¯ï¼ç¶åç±æ¨¡åèªå¨æ¥å¯»æ¾éåçæ¹å¼ãæ¾ç¶Python 3ç¸å¯¹Python 2æäºå¾å¤§è¿æ¥ã
###éåæ¥è¯¢
å
è¦åä¸ä¸ªXMLææ¡£ãå¾çäºï¼å°±ç¨w3schoolä¸çä¸ä¸ªä¾åï¼

è¿æ¯ä¸æ£µæ ï¼å
æè¿æ£µæ åæXMLææ¡£æ ¼å¼ï¼
Everyday Italian
Giada De Laurentiis
2005
30.00
Harry Potter
J K. Rowling
2005
29.99
Learning XML
Erik T. Ray
2003
39.95
å°å
¶ä¿åå¹¶å½å为22601.xmlçæä»¶ï¼æ¥ä¸æ¥å°±æ¯ä»¥å®ä¸ºå¯¹è±¡ï¼ç»ä¹ åç§ææ°äºã
>>> import xml.etree.ElementTree as ET
å¦æè¯»è
使ç¨Python 2ï¼æ¨è使ç¨å¦åæè¿°ç`try...except...`æ¹å¼å¼å
¥æ¨¡åï¼å¦ææ¯Python 3ï¼æç
§åæçæ¹å¼å¼å
¥å³å¯ã
>>> tree = ET.ElementTree(file="22601.xml")
>>> tree
建ç«èµ·XMLè§£ææ å¯¹è±¡ãç¶åéè¿æ ¹èç¹åä¸å¼å§è¯»åå个å
ç´ ï¼element对象ï¼ã
å¨ä¸è¿°XMLææ¡£ä¸ï¼æ ¹å
ç´ æ¯ï¼å®æ²¡æå±æ§ï¼æè
屿§ä¸ºç©ºã
>>> root = tree.getroot() #è·å¾æ ¹
>>> root.tag
'bookstore'
>>> root.attrib
{}
è¦æ³å°æ ¹ä¸é¢çå
ç´ é½è¯»åºæ¥ï¼å¯ä»¥ï¼
>>> for child in root:
... print child.tag, child.attrib #Python 3: print(child.tag, child.attrib)
...
book {'category': 'COOKING'}
book {'category': 'CHILDREN'}
book {'category': 'WEB'}
ä¹å¯ä»¥è¿æ ·è¯»åæå®å
ç´ çä¿¡æ¯ï¼
>>> root[0].tag
'book'
>>> root[0].attrib
{'category': 'COOKING'}
>>> root[0].text #æ å
容
'\n '
åæ·±å
¥ä¸å±ï¼å°±æå
容äºï¼
>>> root[0][0].tag
'title'
>>> root[0][0].attrib
{'lang': 'en'}
>>> root[0][0].text
'Everyday Italian'
对äºElementTreeå¯¹è±¡ï¼æä¸ä¸ª`iter()`æ¹æ³å¯ä»¥å¯¹æå®åç§°çåèç¹è¿è¡æ·±åº¦ä¼å
éåãä¾å¦ï¼
>>> for ele in tree.iter(tag="book"): #éåå称为bookçèç¹
... print ele.tag, ele.attrib #Python 3: print(ele.tag, ele.attrib)
...
book {'category': 'COOKING'}
book {'category': 'CHILDREN'}
book {'category': 'WEB'}
>>> for ele in tree.iter(tag="title"): #éåå称为titleçèç¹
... print ele.tag, ele.attrib, ele.text #Python 3: print(ele.tag, ele.attrib, ele.text)
...
title {'lang': 'en'} Everyday Italian
title {'lang': 'en'} Harry Potter
title {'lang': 'en'} Learning XML
妿䏿å®å
ç´ åç§°ï¼å°±æ¯å°ææçå
ç´ éåä¸è¾¹ã
>>> for ele in tree.iter():
... print ele.tag, ele.attrib #Python 3: print(ele.tag, ele.attrib)
...
bookstore {}
book {'category': 'COOKING'}
title {'lang': 'en'}
author {}
year {}
price {}
book {'category': 'CHILDREN'}
title {'lang': 'en'}
author {}
year {}
price {}
book {'category': 'WEB'}
title {'lang': 'en'}
author {}
year {}
price {}
é¤äºä¸é¢çæ¹æ³ï¼è¿å¯ä»¥éè¿è·¯å¾æç´¢å°æå®çå
ç´ ï¼è¯»åå
¶å
容ï¼è¿å°±æ¯xpathãæ¤å¤å¯¹xpathä¸è¯¦è§£ï¼å¦æè¦äºè§£å¯ä»¥å°ç½ä¸æç´¢æå
³ä¿¡æ¯ã
>>> for ele in tree.iterfind("book/title"):
... print ele.text #Python 3: print(ele.text)
...
Everyday Italian
Harry Potter
Learning XML
å©ç¨`findall()`æ¹æ³ï¼ä¹å¯ä»¥æ¯å®ç°æ¥æ¾åè½ï¼
>>> for ele in tree.findall("book"):
... title = ele.find('title').text
... price = ele.find('price').text
... lang = ele.find('title').attrib
... print title, price, lang #Python 3: print(title, price, lang)
...
Everyday Italian 30.00 {'lang': 'en'}
Harry Potter 29.99 {'lang': 'en'}
Learning XML 39.95 {'lang': 'en'}
###ç¼è¾
é¤äºè¯»åæå
³æ°æ®ä¹å¤ï¼è¿è½å¯¹XMLè¿è¡ç¼è¾ï¼å³å¢ãå ãæ¹ãæ¥åè½ãè¿æ¯ä»¥ä¸é¢çXMLææ¡£ä¸ºä¾ï¼
>>> root[1].tag
'book'
>>> del root[1]
>>> for ele in root:
... print ele.tag #Python 3: print(ele.tag)
...
book
book
妿¤ï¼æåå é¤äºä¸ä¸ªèç¹ã忥æä¸ä¸ªbookèç¹ï¼ç°å¨å°±è¿å©ä¸¤ä¸ªäºãæå¼æºæä»¶åççï¼æ¯ä¸æ¯æ£å¥½å°äºç¬¬äºä¸ªèç¹å¢ï¼ä¸å®å¾è®©ä½ 失æï¼æºæä»¶å±
ç¶æ²¡æååã
çç¡®å¦æ¤ï¼æºæä»¶æ²¡æååï¼å ä¸ºè³æ¤çä¿®æ¹å¨ä½ï¼è¿æ¯åçå¨å
åä¸ï¼è¿æ²¡æå°ä¿®æ¹ç»æè¾åºå°æä»¶ãä¸è¦å¿è®°ï¼æä»¬æ¯å¨å
åä¸å»ºç«çElementTree对象ãåè¿æ ·åï¼
>>> import os
>>> outpath = os.getcwd()
>>> file = outpath + "/22601.xml"
æå½åæä»¶è·¯å¾æ¼è£
好ãç¶åï¼
>>> tree.write(file)
åçæºæä»¶ï¼å·²ç»åæä¸¤ä¸ªèç¹äºã
é¤äºå é¤ï¼ä¹è½å¤ä¿®æ¹ï¼
>>> for price in root.iter("price"): #åæ¥æ¯æ¬ä¹¦çä»·æ ¼
... print price.text #Python 3: print(pice.text)
...
30.00
39.95
>>> for price in root.iter("price"): #æ¯æ¬ä¸æ¶¨7å
ï¼å¹¶ä¸å¢å 屿§æ è®°
... new_price = float(price.text) + 7
... price.text = str(new_price)
... price.set("updated","up")
...
>>> tree.write(file)
æ¥çæºæä»¶ï¼
Everyday Italian
Giada De Laurentiis
2005
37.0
Learning XML
Erik T. Ray
2003
46.95
ä¸ä»
ä»·æ ¼ä¿®æ¹äºï¼èä¸å¨priceæ ç¾éé¢å¢å äºå±æ§æ è®°ãå¹²å¾ä¸éã
ä¸é¢ç¨`del`æ¥å é¤æä¸ªå
ç´ ï¼å
¶å®ï¼å¨ç¼ç¨ä¸ç¨çä¸å¤ï¼æ´å欢ç¨`remove()`æ¹æ³ãæ¯å¦æè¦å é¤`price > 40`ç书ãå¯ä»¥è¿ä¹åï¼
>>> for book in root.findall("book"):
... price = book.find("price").text
... if float(price) > 40.0:
... root.remove(book)
...
>>> tree.write(file)
äºæ¯å°±è¿æ ·äºï¼
Everyday Italian
Giada De Laurentiis
2005
37.0
æ¥ä¸æ¥å°±è¦å¢å å
ç´ äºã
>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file="22601.xml")
>>> root = tree.getroot()
>>> ET.SubElement(root, "book") #å¨rooté颿·»å bookèç¹
>>> for ele in root:
... print ele.tag #Python 3: print(ele.tag)
...
book
book
>>> b2 = root[1] #å¾å°æ°å¢çbookèç¹
>>> b2.text = "python" #æ·»å å
容
>>> tree.write("22601.xml")
æ¥çæºæä»¶ï¼
Everyday Italian
Giada De Laurentiis
2005
37.0
python
###常ç¨å±æ§åæ¹æ³æ»ç»
ETéé¢ç屿§åæ¹æ³ä¸å°ï¼è¿éååºå¸¸ç¨çï¼ä¾ä½¿ç¨ä¸å¤æ¥ã
**Element对象**
常ç¨å±æ§ï¼
- tagï¼stringï¼å
ç´ æ°æ®ç§ç±»
- textï¼stringï¼å
ç´ çå
容
- attribï¼dictionaryï¼å
ç´ ç屿§åå
¸
- tailï¼stringï¼å
ç´ ç尾形
é坹屿§çæä½
- clear()ï¼æ¸
空å
ç´ çå代ã屿§ãtextåtailä¹è®¾ç½®ä¸ºNone
- get(key, default=None)ï¼è·åkey对åºç屿§å¼ï¼å¦è¯¥å±æ§ä¸åå¨åè¿ådefaultå¼
- items()ï¼æ ¹æ®å±æ§åå
¸è¿åä¸ä¸ªå表ï¼å表å
ç´ ä¸º(key, valueï¼
- keys()ï¼è¿åå
嫿æå
ç´ å±æ§é®çå表
- set(key, value)ï¼è®¾ç½®æ°ç屿§é®ä¸å¼
é对å代çæä½
- append(subelement)ï¼æ·»å ç´ç³»åå
ç´
- extend(subelements)ï¼å¢å ä¸ä¸²å
ç´ å¯¹è±¡ä½ä¸ºåå
ç´
- find(match)ï¼å¯»æ¾ç¬¬ä¸ä¸ªå¹é
åå
ç´ ï¼å¹é
对象å¯ä»¥ä¸ºtagæpath
- findall(match)ï¼å¯»æ¾ææå¹é
åå
ç´ ï¼å¹é
对象å¯ä»¥ä¸ºtagæpath
- findtext(match)ï¼å¯»æ¾ç¬¬ä¸ä¸ªå¹é
åå
ç´ ï¼è¿åå
¶textå¼ãå¹é
对象å¯ä»¥ä¸ºtagæpath
- insert(index, element)ï¼å¨æå®ä½ç½®æå
¥åå
ç´
- iter(tag=None)ï¼çæéåå½åå
ç´ ææå代æè
ç»å®tagçå代çè¿ä»£å¨
- iterfind(match)ï¼æ ¹æ®tagæpathæ¥æ¾ææçå代
- itertext()ï¼éåææå代并è¿åtextå¼
- remove(subelement)ï¼å é¤åå
ç´
**ElementTree对象**
- find(match)
- findall(match)
- findtext(match, default=None)
- getroot()ï¼è·åæ ¹èç¹.
- iter(tag=None)
- iterfind(match)
- parse(source, parser=None)ï¼è£
è½½xml对象ï¼sourceå¯ä»¥ä¸ºæä»¶åææä»¶ç±»å对象.
- write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None,method="xml")ã
###ä¸ä¸ªå®ä¾
æåï¼æä¾ä¸ä¸ªåèï¼è¿æ¯ä¸ç¯æ¥èªç½ç»çæç« ï¼[Python xml屿§ãèç¹ãææ¬çå¢å æ¹](http://blog.csdn.net/wklken/article/details/7603071)ï¼æ¬æçæºç æä¹å¤å¶å°ä¸é¢ï¼è¯·è¯»è
åèï¼
å®ç°ææ³ï¼
使ç¨ElementTreeï¼å
å°æä»¶è¯»å
¥ï¼è§£æææ ï¼ä¹åï¼æ ¹æ®è·¯å¾ï¼å¯ä»¥å®ä½å°æ çæ¯ä¸ªèç¹ï¼å对èç¹è¿è¡ä¿®æ¹ï¼æåç´æ¥å°å
¶è¾åº.
#!/usr/bin/python
# -*- coding=utf-8 -*-
# author : [email protected]
# date: 2012-05-25
# version: 0.1
from xml.etree.ElementTree import ElementTree,Element
def read_xml(in_path):
'''
读åå¹¶è§£æxmlæä»¶
in_path: xmlè·¯å¾
return: ElementTree
'''
tree = ElementTree()
tree.parse(in_path)
return tree
def write_xml(tree, out_path):
'''
å°xmlæä»¶ååº
tree: xmlæ
out_path: ååºè·¯å¾
'''
tree.write(out_path, encoding="utf-8",xml_declaration=True)
def if_match(node, kv_map):
'''
夿æä¸ªèç¹æ¯å¦å
嫿æä¼ å
¥åæ°å±æ§
node: èç¹
kv_map: 屿§å屿§å¼ç»æçmap
'''
for key in kv_map:
if node.get(key) != kv_map.get(key):
return False
return True
#---------------search -----
def find_nodes(tree, path):
'''
æ¥æ¾æä¸ªè·¯å¾å¹é
çææèç¹
tree: xmlæ
path: èç¹è·¯å¾
'''
return tree.findall(path)
def get_node_by_keyvalue(nodelist, kv_map):
'''
æ ¹æ®å±æ§å屿§å¼å®ä½ç¬¦åçèç¹ï¼è¿åèç¹
nodelist: èç¹å表
kv_map: å¹é
屿§å屿§å¼map
'''
result_nodes = []
for node in nodelist:
if if_match(node, kv_map):
result_nodes.append(node)
return result_nodes
#---------------change -----
def change_node_properties(nodelist, kv_map, is_delete=False):
'''
ä¿®æ¹/å¢å /å é¤ èç¹ç屿§å屿§å¼
nodelist: èç¹å表
kv_map:屿§å屿§å¼map
'''
for node in nodelist:
for key in kv_map:
if is_delete:
if key in node.attrib:
del node.attrib[key]
else:
node.set(key, kv_map.get(key))
def change_node_text(nodelist, text, is_add=False, is_delete=False):
'''
æ¹å/å¢å /å é¤ä¸ä¸ªèç¹çææ¬
nodelist:èç¹å表
text : æ´æ°åçææ¬
'''
for node in nodelist:
if is_add:
node.text += text
elif is_delete:
node.text = ""
else:
node.text = text
def create_node(tag, property_map, content):
'''
æ°é ä¸ä¸ªèç¹
tag:èç¹æ ç¾
property_map:屿§å屿§å¼map
content: èç¹éåæ ç¾éçææ¬å
容
return æ°èç¹
'''
element = Element(tag, property_map)
element.text = content
return element
def add_child_node(nodelist, element):
'''
ç»ä¸ä¸ªèç¹æ·»å åèç¹
nodelist: èç¹å表
element: åèç¹
'''
for node in nodelist:
node.append(element)
def del_node_by_tagkeyvalue(nodelist, tag, kv_map):
'''
åè¿å±æ§å屿§å¼å®ä½ä¸ä¸ªèç¹ï¼å¹¶å é¤ä¹
nodelist: ç¶èç¹å表
tag:åèç¹æ ç¾
kv_map: 屿§å屿§å¼å表
'''
for parent_node in nodelist:
children = parent_node.getchildren()
for child in children:
if child.tag == tag and if_match(child, kv_map):
parent_node.remove(child)
if __name__ == "__main__":
#1. 读åxmlæä»¶
tree = read_xml("./test.xml")
#2. 屿§ä¿®æ¹
#A. æ¾å°ç¶èç¹
nodes = find_nodes(tree, "processers/processer")
#B. éè¿å±æ§åç¡®å®ä½åèç¹
result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})
#C. ä¿®æ¹èç¹å±æ§
change_node_properties(result_nodes, {"age": "1"})
#D. å é¤èç¹å±æ§
change_node_properties(result_nodes, {"value":""}, True)
#3. èç¹ä¿®æ¹
#A.æ°å»ºèç¹
a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")
#B.æå
¥å°ç¶èç¹ä¹ä¸
add_child_node(result_nodes, a)
#4. å é¤èç¹
#å®ä½ç¶èç¹
del_parent_nodes = find_nodes(tree, "processers/services/service")
#åç¡®å®ä½åèç¹å¹¶å é¤ä¹
target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})
#5. ä¿®æ¹èç¹ææ¬
#å®ä½èç¹
text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})
change_node_text(text_nodes, "new text")
#6. è¾åºå°ç»ææä»¶
write_xml(tree, "./out.xml")
æä½å¯¹è±¡ï¼åå§xmlæä»¶ï¼ï¼
æ§è¡ç¨åºä¹åï¼å¾å°çç»ææä»¶ï¼
this is the firest content
this is the firest content
new text
------
[æ»ç®å½](./index.md) | [ä¸èï¼æ ååº(6)](./225.md) | [ä¸èï¼æ ååº(8)](./227.md)
å¦æä½ è®¤ä¸ºæå¿
è¦æèµæï¼è¯·éè¿æ¯ä»å®ï¼**[email protected]**,ä¸èææ¿ã