前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python解析xml文件

python解析xml文件

作者头像
Dean0731
发布2020-05-08 15:47:36
1.3K0
发布2020-05-08 15:47:36
举报
文章被收录于专栏:blog-技术博客blog-技术博客

python解析xml文档

1,DOM(基于对象) 主要思想:从根节点开始按照标签值 逐层查找

代码语言:javascript
复制
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] 获取的是<a><x>之间的飞标签字符,包含换行,或其他字符
    # dom(a标签).childNodes[1] 即可得到<x></x>标签
    """
    <a>
        <x></x>
    </a>
    """
    # 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更多的控制,更有效率,但需要的工作较多

代码语言:javascript
复制
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

代码语言:javascript
复制
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标签中的非标签值
    """
    <i>xx</i>  i.text=xx
    <i>
    <x></x> i.text=换行
    </i>
    <i><x></x> i.text=None
    </i>
    """

xml文件

代码语言:javascript
复制
<annotation>
	<folder>VOC2012</folder>
	<filename>2007_000027.jpg</filename>
	<source>
		<database>The VOC2007 Database</database>
		<annotation>PASCAL VOC2007</annotation>
		<image>flickr</image>
	</source>
	<size>
		<width>486</width>
		<height>500</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>person</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>174</xmin>
			<ymin>101</ymin>
			<xmax>349</xmax>
			<ymax>351</ymax>
		</bndbox>
		<part>
			<name>head</name>
			<bndbox>12
				<xmin>169</xmin>
				<ymin>104</ymin>
				<xmax>209</xmax>
				<ymax>146</ymax>
			</bndbox>
		</part>
		<part>
			<name>hand</name>
			<bndbox>
				<xmin>278 asd</xmin>
				<ymin>210</ymin>
				<xmax>297</xmax>
				<ymax>233</ymax>
			</bndbox>
		</part>
		<part>
			<name>foot</name>
			<bndbox>
				<xmin>273</xmin>
				<ymin>333</ymin>
				<xmax>297</xmax>
				<ymax>354</ymax>
			</bndbox>
		</part>
		<part>
			<name>foot</name>
			<bndbox>
				<xmin>319</xmin>
				<ymin>307</ymin>
				<xmax>340</xmax>
				<ymax>326</ymax>
			</bndbox>
		</part>
	</object>
</annotation>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python解析xml文档
    • 1,DOM(基于对象) 主要思想:从根节点开始按照标签值 逐层查找
      • 2,SAX (基于事件):比dom更多的控制,更有效率,但需要的工作较多
        • 3,ElementTree 将xml转化为tree
          • xml文件
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档