Python/XML工具
外觀
< Python
ElementTree
[編輯]ElementTree是python的XML處理模塊,它提供了一個輕量級的對象模型。它在Python2.5以後成為Python標準庫的一部分。
import xml.etree.ElementTree的操作。
ElementTree表示整個XML節點樹,而Element表示節點數中的一個單獨的節點。
構造函數:
- ElementTree(tag),其中tag表示根節點,初始化一個ElementTree對象。
- Element(tag, attrib={}, **extra)函數用來構造XML的一個根節點,其中tag表示根節點的名稱,attrib是一個可選項,表示節點的屬性。
- SubElement(parent, tag, attrib={}, **extra)用來構造一個已經存在的節點的子節點
- Element.text和SubElement.text表示element對象的額外的內容屬性,Element.tag和Element.attrib分別表示element對象的標籤和屬性。
- ElementTree.write(file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml'),函數新建一個XML文件,並且將節點數數據寫入XML文件中。
#encoding=utf-8
import xml.etree.ElementTree as ET
#新建xml文件
def buildNewsXmlFile():
#设置一个新节点,并设置其标签为root
root = ET.Element("root")
#在root下新建两个子节点,设置其名称分别为sina和chinabyte
sina = ET.SubElement(root, "sina")
chinabyte = ET.SubElement(root, "chinabyte")
#在sina下新建两个子节点,设置其节点名称分别为number和first
sina_number = ET.SubElement(sina, "number")
sina_number.text = "1"
sina_first = ET.SubElement(sina, "first")
sina_first.text = "http://roll.tech.sina.com.cn/internet_all/index_1.shtml"
#在chinabyte下新建两个子节点,设置其节点名称为number和first
chinabyte_number = ET.SubElement(chinabyte, "number")
chinabyte_number.text = "1"
chinabyte_first = ET.SubElement(chinabyte, "first")
chinabyte_first.text = "http://www.chinabyte.com/more/124566.shtml"
#将节点数信息保存在ElementTree中,并且保存为XML格式文件
tree = ET.ElementTree(root)
tree.write("urlfile.xml")
解析和修改XML文件:
- ElementTree.parse(source, parser=None),將xml文件加載並返回ElementTree對象。parser是一個可選的參數,如果為空,則默認使用標準的XMLParser解析器。
- ElementTree.getroot(),得到根節點。返回根節點的element對象。
- Element.remove(tag),刪除root下名稱為tag的子節點
以下函數,ElementTree和Element的對象都包含:
- find(match),得到第一個匹配match的子節點,match可以是一個標籤名稱或者是路徑。返回個element
- findtext(match,default=None),得到第一個配置的match的element的內容
- findall(match),得到匹配match下的所有的子節點,match可以是一個標籤或者是路徑,它會返回一個list,包含匹配的elements的信息
- iter(tag),創建一個以當前節點為根節點的iterator。
一個xml文件:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
解析xml文件的代碼:
#解析Xml文件
def parseXmlFile(xml_name):
#将XMl文件加载并返回一个ELementTree对象
tree = ET.parse(xml_name)
#得到第一个匹配sina标签的Element对象
sina = tree.find("contry")
#得到sina的SubElement
for sub_tag in sina:
print sub_tag.text
#得到所有匹配sina标签的Element对象的list集合
list_contry = tree.findall("contry")
for contry in list_contry:
for sub_tag in contry:
print sub_tag.text
#修改xml文件
for rank in tree.iter('rank')
new_rank = int(rank.text)+1
rank.text = str(new_rank)
rank.set('updated', 'yes')
tree.write(xml_name)
第一次的輸出是:1,2008,14100
第二次的輸出是:1,2008,14100,4,2011,59900,68,2011,13600
修改後的xml文件為:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>