之前在轉換數據集格式的時候需要將json轉換到xml文件,用lxml包進行操作非常方便。
1. 寫xml文件
a) 用etree和objectify
from lxml import etree, objectifyE = objectify.ElementMaker(annotate=False)anno_tree = E.annotation( E.folder('VOC2014_instance'), E.filename("test.jpg"), E.source( E.database('COCO'), E.annotation('COCO'), E.image('COCO'), E.url("http://test.jpg") ), E.size( E.width(800), E.height(600), E.depth(3) ), E.segmented(0),)etree.ElementTree(anno_tree).write("text.xml", pretty_print=True)輸出的test.xml文件內容如下:
```
如果需要在anno_tree的基礎上加其他標簽的話用append即可:
E2 = objectify.ElementMaker(annotate=False)anno_tree2 = E2.object( E.name("person"), E.bndbox( E.xmin(100), E.ymin(200), E.xmax(300), E.ymax(400) ), E.difficult(0))anno_tree.append(anno_tree2)上面的輸出就變成了:
<annotation> <folder>VOC2014_instance/person</folder> <filename>test.jpg</filename> <source> <database>COCO</database> <annotation>COCO</annotation> <image>COCO</image> <url>http://test.jpg</url> </source> <size> <width>800</width> <height>600</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>person</name> <bndbox> <xmin>100</xmin> <ymin>200</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> <difficult>0</difficult> </object></annotation>
b) 用etree和SubElement
annotation = etree.Element("annotation")etree.SubElement(annotation, "folder").text = "VOC2014_instance"etree.SubElement(annotation, "filename").text = "test.jpg"source = etree.SubElement(annotation, "source")etree.SubElement(source, "database").text = "COCO"etree.SubElement(source, "annotation").text = "COCO"etree.SubElement(source, "image").text = "COCO"etree.SubElement(source, "url").text = "http://test.jpg"size = etree.SubElement(annotation, "size")etree.SubElement(size, "width").text ='800' # 必須用stringetree.SubElement(size, "height").text = '600'etree.SubElement(size, "depth").text = '3'etree.SubElement(annotation, "segmented").text = '0'key_object = etree.SubElement(annotation, "object")etree.SubElement(key_object, "name").text = “person”bndbox = etree.SubElement(key_object, "bndbox")etree.SubElement(bndbox, "xmin").text = str(100)etree.SubElement(bndbox, "ymin").text = str(200)etree.SubElement(bndbox, "xmax").text = str(300)etree.SubElement(bndbox, "ymax").text = str(400)etree.SubElement(key_object, "difficult").text = '0'doc = etree.ElementTree(annotation)doc.write(open("test.xml", "w"), pretty_print=True)2. 讀xml
這里可以用xpath直接提取所需的元素的值。比如想要獲取上面test.xml文件的x, y坐標:
tree = etree.parse("test.xml")# get bboxfor bbox in tree.xpath('//bndbox'): # 獲取bndbox元素的內容 for corner in bbox.getchildren(): # 便利bndbox元素下的子元素 print corner.text # string類型參考
https://stackoverflow.com/questions/12657043/parse-xml-with-lxml-extract-element-value
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答
圖片精選