xml的解析和修改:
xml的解析就是對xml節點的值的讀取.網上有三種讀取方式,我採用xml.dom.minidom和xml.etree.cElementTree,現在對於兩者的區別不是很了了解.https://www.jb51.net/article/63780.htm這篇文章寫的還是相對詳細,但是也是主要說明使用方法. http://www.w3school.com.cn/x.asp這個網站有xml的詳細介紹.
1.使用xml.dom.minidom解析和修改xml文件:
xml文件:
<object> #object是元素,有屬性 <name>guohui</name> # name 爲object子元素 <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> # bndbox 爲object子元素 <xmin>885</xmin> # xmin 爲bndbox子元素 <ymin>429</ymin> <xmax>907</xmax> <ymax>457</ymax> </bndbox> </object>
def ReadXml(xmlfile):
dom = xml.dom.minidom.parse(xmlfile) #打開xml文檔
root = dom.documentElement #得到xml文檔對象
tree = ET.parse(xmlfile)
name =root.getElementsByTagName('name')
xmin =root.getElementsByTagName('xmin')
ymin =root.getElementsByTagName('ymin')
xmax =root.getElementsByTagName('xmax')
ymax =root.getElementsByTagName('ymax')
x1 = y1 = 10000
x2 = y2 = 0 #讀取xmin的數據
for i in range(len(name)):
if int(xmin[i].firstChild.data) <= x1:
x1 = int(xmin[i].firstChild.data)
if int(ymin[i].firstChild.data) <= y1:
y1 = int(ymin[i].firstChild.data)
if int(xmax[i].firstChild.data) >= x2:
x2 = int(xmax[i].firstChild.data)
if int(ymax[i].firstChild.data) >= y2:
y2 = int(ymax[i].firstChild.data)
results = [x1-30, y1-30, x2+30, y2+30]
return results, tree
2.使用xml.etree.cElementTree解析和修改xml文件:
def read_xml(xmlname):
tree = ET.parse(xmlname)
root = tree.getroot()
return tree,root
def modify(xmlfile):
tree, root = read_xml(xmlfile)
objs = tree.findall('object')
for obj in objs:
bbox = obj.find('bndbox')
if int(bbox.find('xmin').text) >= int(bbox.find('xmax').text):
bbox.find('xmin').text,bbox.find('xmax').text = bbox.find('xmax').text,bbox.find('xmin').text
print 'modify x'
if int(bbox.find('ymin').text) >= int(bbox.find('ymax').text):
bbox.find('ymin').text,bbox.find('ymax').text = bbox.find('ymax').text,bbox.find('ymin').text
print 'modify y'
write_xml(tree,xmlfile)