Administrator
发布于 2026-05-17 / 1 阅读
0

python解析xml文件

# python解析xml文档 ## 1,DOM(基于对象) 主要思想:从根节点开始按照标签值 逐层查找 \`\`\`python from xml.dom import minidom # 打开文件 DomTree = minidom.parse('path') # 获取xml对象 annotation = DomTree.documentElement # 获取一级节点 列表返回 folder=annotation.getElementsByTagName("folder") filename=annotation.getElementsByTagName("filename") source=annotation.getElementsByTagName("source") size=annotation.getElementsByTagName("size") segmented=annotation.getElementsByTagName("segmented") obj=annotation.getElementsByTagName("object") # 在obj列表的第一个对象中查找part part = obj\[0\].getElementsByTagName("part") for i in part: name=i.getElementsByTagName("name")\[0\].childNodes\[0\] bndbox=i.getElementsByTagName("bndbox")\[0\] # 例:dom(a标签).childNodes\[0\] 获取的是之间的飞标签字符,包含换行,或其他字符 # dom(a标签).childNodes\[1\] 即可得到标签 """ """ # dom.getAttribute("id") 可获取属性值 xmin = bndbox.getElementsByTagName("xmin")\[0\].childNodes\[0\].data ymin = bndbox.getElementsByTagName("ymin")\[0\].childNodes\[0\].data xmax = bndbox.getElementsByTagName("xmax")\[0\].childNodes\[0\].data ymax = bndbox.getElementsByTagName("ymax")\[0\].childNodes\[0\].data print(name,bndbox,xmin,ymin,xmax,ymax,type(bndbox.getElementsByTagName("xmin")\[0\])) \`\`\` 注: getElementsByTagName()----\>class Element Element.childNodes ------\>Dom 类型 ## 2,SAX (基于事件):比dom更多的控制,更有效率,但需要的工作较多 \`\`\`python import xml.sax class AnnotationHandler(xml.sax.ContentHandler): def ___init__(self): self.firstAttr="" self.secAttr="" def startElement(self,tag,attribute): pass def characters(self,content): pass def endElement(self,tag): pass parser = xml.sax.make_parser() # 关闭namespaces parser.setFeature(xml.sax.handler.feature_namespaces,0) parser.setContentHandler(AnnotationHandler()) parser.parse("path") \`\`\` 详见 https://www.cnblogs.com/hongfei/p/python-xml-sax.html ## 3,ElementTree 将xml转化为tree \`\`\`python import xml.etree.ElementTree as et tree = et.parse('path') root=tree.getroot() # 获取根节点 print(root.tag,root.attrib) # annotation 标签名 , 获取属性 for i in root: # 找到root的一级字标签 也可以root\[n\] 获取 print(i.tag,i.text) # i.txt 表示i标签中的非标签值 """ *xx* i.text=xx *i.text=换行* *i.text=None* """ \`\`\` ## xml文件 \`\`\`xml VOC2012 2007_000027.jpg The VOC2007 Database PASCAL VOC2007 flickr 486 500 3 0 person Unspecified 0 0 174 101 349 351 head 12 169 104 209 146 hand 278 asd 210 297 233 foot 273 333 297 354 foot 319 307 340 326 \`\`\`