以下皆使用ElementTree與Minidom這兩個XML的Python API
- Import ElementTree
用cElementTree會比較快因為它是C語言寫的,可以直接使用硬體,下面的import方式就是主要import cElementTree,若沒有C語言base的,才改用python base的套件
try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET
- 讀取檔案與解析node
ElementTree讀取檔案的方式也很簡單,只要在建立ElementTree物件的時候給他XML檔案位置即可
file_name = 'path_to_file' tree = ET.ElementTree(file=file_name)
至於為什麼物件的命名是用tree呢?這是因為XML的格式就好像一棵樹一樣,由一個跟節點延伸出分支,然後各分支又可延伸出更多分支
以PascalVOC為例root|--folder|--filename|--source|--database|--annotation|--image|--flickrid|--owner|--flickrid|--name|--size|--width|--height|--depth|--segmented|--object|--name|--pose|--truncated|--difficult|--bndbox|--xmin|--ymin|--xmax|--ymax|--object...
有了xml tree物件之後,便可以開始讀取裡面的node。我自己會用到的為以下3種
1. 直接遍歷屬於root的節點(不過需要事先知道要找的node在哪一層,才能再更進去找)root = tree.getroot() for elem in root: print(elem.tag, elem.attrib, elem.text)
2. 利用iter()進行節點遍歷for elem in tree.iter(): print(elem.tag, elem.attrib, elem.text)
3.利用iter(tag="node_name")針對特定節點遍歷for elem in tree.iter(tag='bndbox'): print(elem.tag, elem.attrib, elem.text)
- 寫入XML檔案
要製作自己的資料集,寫入xml檔其實是最快的方式,接下來的紀錄是我用xml.dom.minidom來寫檔(VOC格式)
1. 建立rootimport xml.dom.minidom #create empty root doc = xml.dom.minidom.Document() #create root node root = doc.createElement('annotation') doc.appendChild(root)
2. 建立子節點並幫子節點接上文字節點(text部分視為末端點)nodeFolder = doc.createElement('folder') nodeFolder.appendChild(doc.createTextNode(folder))
3. 建立將子節點接到根結點或其他子節點上root.appendChild(nodeFolder)
4. 開檔以及將建立好的xml tree寫入f_n = "file_name.xml" fp = open(f_n, 'w') doc.writexml(fp, indent='\t', addindent='\t', newl='\n', encoding="utf-8")
到這邊就完成了
不過要注意的一點是節點順序,建立的順序錯誤,檔案的節點順序就會錯誤
以上就是有關於xml讀寫方式的小小記錄,不過我覺得寫入的方式有點冗長,或許用ElemntTree可以更快也更統一,之後有空會來研究看看。
參考資料:
https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/processing-xml-in-python-with-element-tree.html
https://docs.python.org/2/library/xml.etree.elementtree.html
http://note.qidong.name/2017/11/write-xml-with-minidom/
https://docs.python.org/2/library/xml.dom.minidom.html
參考資料:
https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/processing-xml-in-python-with-element-tree.html
https://docs.python.org/2/library/xml.etree.elementtree.html
http://note.qidong.name/2017/11/write-xml-with-minidom/
https://docs.python.org/2/library/xml.dom.minidom.html