python檔案處理:解析.xml檔案__python

來源:互聯網
上載者:User

XML(eXtensible Markup Language)指可延伸標記語言 (XML),被設計用來傳輸和儲存資料,已經日趨成為當前許多新生技術的核心,在不同的領域都有著不同的應用。它是web發展到一定階段的必然產物,既具有SGML的核心特徵,又有著HTML的簡單特性,還具有明確和結構良好等許多新的特性。

在做目標檢測手工標註資料集的時候,通常會把標註的目標位置資訊寫入一個.xml檔案,但在檢查資料和資料清洗的時候,面對一堆座標資料很難對標註的準確性進行檢查,所以通常需要對xml檔案進行解析,讀出其中儲存的目標和目標的一些資訊。
需要解析的xml檔案如下

<annotation>  <folder>Images</folder>  <filename>00001</filename>  <path>E:\Images\00001.jpg</path>  <source>    <database>Unknown</database>  </source>  <size>    <width>432</width>    <height>495</height>    <depth>3</depth>  </size>  <segmented>0</segmented>  <object>    <name>mirror</name>    <pose>Unspecified</pose>    <truncated>0</truncated>    <difficult>0</difficult>    <bndbox>      <xmin>3</xmin>      <ymin>159</ymin>      <xmax>52</xmax>      <ymax>202</ymax>    </bndbox>  </object>  <object>    <name>mirror</name>    <pose>Unspecified</pose>    <truncated>0</truncated>    <difficult>0</difficult>    <bndbox>      <xmin>370</xmin>      <ymin>134</ymin>      <xmax>427</xmax>      <ymax>179</ymax>    </bndbox>  </object>  <object>    <name>glass</name>    <pose>Unspecified</pose>    <truncated>0</truncated>    <difficult>0</difficult>    <bndbox>      <xmin>56</xmin>      <ymin>102</ymin>      <xmax>373</xmax>      <ymax>224</ymax>    </bndbox>  </object>  <object>    <name>light</name>    <pose>Unspecified</pose>    <truncated>0</truncated>    <difficult>0</difficult>    <bndbox>      <xmin>29</xmin>      <ymin>325</ymin>      <xmax>114</xmax>      <ymax>389</ymax>    </bndbox>  </object>  <object>    <name>light</name>    <pose>Unspecified</pose>    <truncated>0</truncated>    <difficult>0</difficult>    <bndbox>      <xmin>322</xmin>      <ymin>305</ymin>      <xmax>405</xmax>      <ymax>372</ymax>    </bndbox>  </object></annotation>

Ok ,從結構上,它很像我們常見的HTML超文字標記語言 (HTML)。但他們被設計的目的是不同的,超文字標記語言 (HTML)被設計用來顯示資料,其焦點是資料的外觀。它被設計用來傳輸和儲存資料,其焦點是資料的內容。

那麼它有如下特徵:

首先,它是有標籤對組成:
<aa></aa>
標籤可以有屬性:<aa id=’123’></aa>
標籤對可以嵌入資料:<aa>abc</aa>
標籤可以嵌入子標籤(具有層級關係):

<aa>     <bb></bb></aa>

上面的xml檔案儲存了目標的名字:name和四個座標(xmin, ymin, xmax, ymax),使用python對其進行解析。

#coding=utf-8import  xml.dom.minidom#開啟xml文檔dom = xml.dom.minidom.parse('abc.xml')#得到文件項目對象root = dom.documentElementprint root.nodeNameprint root.nodeValueprint root.nodeTypeprint root.ELEMENT_NODE

mxl.dom.minidom 模組被用來處理xml檔案,所以要先引入。

xml.dom.minidom.parse() 用於開啟一個xml檔案,並將這個檔案對象dom變數。

documentElement 用於得到dom對象的文件項目,並把獲得的對象給root

每一個結點都有它的nodeName,nodeValue,nodeType屬性。

nodeName為結點名字。

nodeValue是結點的值,只對文本結點有效。

nodeType是結點的類型。catalog是ELEMENT_NODE類型

現在有以下幾種:
‘ATTRIBUTE_NODE’
‘CDATA_SECTION_NODE’
‘COMMENT_NODE’
‘DOCUMENT_FRAGMENT_NODE’
‘DOCUMENT_NODE’
‘DOCUMENT_TYPE_NODE’
‘ELEMENT_NODE’
‘ENTITY_NODE’
‘ENTITY_REFERENCE_NODE’
‘NOTATION_NODE’
‘PROCESSING_INSTRUCTION_NODE’
‘TEXT_NODE’

NodeTypes - 有名常數

對於上文列出的xml檔案,筆者使用了如下指令碼,供讀者進行參考,可根據自己的需要修改。

#! /usr/bin/env python#coding = utf-8from xml.dom.minidom import parseimport xml.dom.minidomfrom PIL import Image, ImageDrawimport osimport ImageFontxml_path = '/Users/Lee/Desktop/check_xml/experiments/xml/'filelists = os.listdir(xml_path)filelists.pop(0)img_path = '/Users/Lee/Desktop/check_xml/experiments/images/'save_path = '/Users/Lee/Desktop/check_xml/experiments/check_img/'num = 0for file in filelists:    xml_file_path = os.path.join(xml_path+file)    DOMTree = xml.dom.minidom.parse(xml_file_path)    Data = DOMTree.documentElement    img_name_tmp = Data.getElementsByTagName("filename")    img_name = img_name_tmp[0].childNodes[0].data    Objects = Data.getElementsByTagName("object")    xmin_1 = []    ymin_1 = []    xmax_1 = []    ymax_1 = []    name_1 = []    for object in Objects:        name = object.getElementsByTagName('name')[0]        name_1.append(name.childNodes[0].data)        xmin = object.getElementsByTagName('xmin')[0]        xmin_1.append(int(xmin.childNodes[0].data))        ymin = object.getElementsByTagName('ymin')[0]        ymin_1.append(int(ymin.childNodes[0].data))        xmax = object.getElementsByTagName('xmax')[0]        xmax_1.append(int(xmax.childNodes[0].data))        ymax = object.getElementsByTagName('ymax')[0]        ymax_1.append(int(ymax.childNodes[0].data))    img = Image.open(os.path.join(img_path+img_name+'.jpg'))    num_object = len(name_1)    for i in range(num_object):        x_text = (xmax_1[i] - xmin_1[i]) * 0.15 + xmin_1[i]        y_text = ymin_1[i] - 25        draw_name = ImageDraw.Draw(img)        font1 = ImageFont.truetype("times_New_Roman.ttf",24)        draw_name.text((x_text, y_text), name_1[i], fill= (255,0,0), font = font1)        draw_rect = ImageDraw.Draw(img)        draw_rect.rectangle([(xmin_1[i], ymin_1[i]), (xmax_1[i], ymax_1[i])],outline=(255,0,0))    img.save(os.path.join(save_path + img_name + '.jpg'))    num = num + 1    if num % 500 == 0:        print num

上述指令碼可以把xml儲存的名字和位置資訊在原圖上反映出來,用以檢查手工標註資料的準確性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.