Python深度学习二----解析XML文件(采用DOM方法)

一.XML文件简述

详细内容请参考以下几篇博主文章:
https://blog.csdn.net/weixin_40684476/article/details/83057238
https://blog.csdn.net/u012562943/article/details/50462179
https://blog.csdn.net/erlian1992/article/details/51544646
https://blog.csdn.net/erlian1992/article/details/51569678
https://blog.csdn.net/erlian1992/article/details/51570210

注:

  1. 在XML中,所有元素都必须有关闭标签。
  2. XML标签对大小写敏感,必须使用相同的大小写来编写打开标签和关闭标签。
  3. 在XML中,所有元素都必须彼此正确地嵌套。
  4. 在XML中,XML的属性值须加引号。
  5. XML文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。
  6. 在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,如
<input name=“text”>
**************************
<input>   
	<name>text</name>
</input>

7.实体引用
在这里插入图片描述

二.XML文件示例

在这里插入图片描述

在这里插入图片描述
1.根元素< annotation >
2.子元素< folder >,< size >,< object >等
3.标签 带< >的都是标签
4.文本 被开始标签和结束标签包含的是文本,如damper, tower等

三.采用DOM解析XML文件

  1. 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
  2. 实现代码(原理参考注释)
from xml.dom.minidom import parse


def readXML():
    # 打开这个文档,用parse方法解析,得到domTree对象
    domTree = parse("C:\\Users\\Tony.Hsu\\Desktop\\Image_000001.xml")
    # 得到文档根元素
    rootNode = domTree.documentElement
    print("****information****")
    print(rootNode.nodeName)
    print(rootNode.nodeType)

    folder_node = rootNode.getElementsByTagName("folder")[0]
    print(folder_node.childNodes[0].data)

    filename_node = rootNode.getElementsByTagName("filename")[0]
    print(filename_node.childNodes[0].data)

    segmented_node = rootNode.getElementsByTagName("segmented")[0]
    print(segmented_node.childNodes[0].data)

    # 得到根节点下面的第一个source节点
    source_node  = rootNode.getElementsByTagName("source")[0]

    image = source_node.getElementsByTagName("image")[0]   # 根据标签名找到,并且输出第一个元素
    print(image.nodeName, ":", image.childNodes[0].data)  # 输出标签名的子节点的第一个值,并转为data类型,读取其文本内容

    database = source_node.getElementsByTagName("database")[0]
    print(database.nodeName, ":", database.childNodes[0].data)

    annotation = source_node.getElementsByTagName("annotation")[0]
    print(annotation.nodeName, ":", annotation.childNodes[0].data)

    # 得到根节点下面的第一个size节点
    size_node = rootNode.getElementsByTagName("size")[0]

    width = size_node.getElementsByTagName("width")[0]
    print(width.nodeName, ":", width.childNodes[0].data)

    height = size_node.getElementsByTagName("height")[0]
    print(height.nodeName, ":", height.childNodes[0].data)

    depth = size_node.getElementsByTagName("depth")[0]
    print(depth.nodeName, ":", depth.childNodes[0].data)

    # 按照名称查找子节点,注意这里会递归查找所有子节点
    # 得到根节点下面所有的object节点

    objects = rootNode.getElementsByTagName("object")

    # 得到根节点下面所有的bndbox节点
    # bndboxs = rootNode.getElementsByTagName("bndbox")

    print("****information of objectives****")

    # 遍历处理,objects是一个列表
    for object in objects:
        # name 元素
        name = object.getElementsByTagName("name")[0]
        print(name.nodeName, ":", name.childNodes[0].data)
        # pose 元素
        pose = object.getElementsByTagName("pose")[0]
        print(pose.nodeName, ":", pose.childNodes[0].data)
        # truncated 元素
        truncated = object.getElementsByTagName("truncated")[0]
        print(truncated.nodeName, ":", truncated.childNodes[0].data)
        # difficult 元素
        difficult = object.getElementsByTagName("difficult")[0]
        print(difficult.nodeName, ":", difficult.childNodes[0].data)
        # bndbox 元素
        bndbox = object.getElementsByTagName("bndbox")[0]

        # xmin 元素
        xmin = bndbox.getElementsByTagName("xmin")[0]
        print(xmin.nodeName, ":", xmin.childNodes[0].data)
        # ymin 元素
        ymin = bndbox.getElementsByTagName("ymin")[0]
        print(ymin.nodeName, ":", ymin.childNodes[0].data)
        # xmax 元素
        xmax = bndbox.getElementsByTagName("xmax")[0]
        print(xmax.nodeName, ":", xmax.childNodes[0].data)
        # ymax 元素
        ymax = bndbox.getElementsByTagName("ymax")[0]
        print(ymax.nodeName, ":", ymax.childNodes[0].data)
        print("*********************")


if __name__ == '__main__':

    readXML()

输出结果

****information****
annotation
1
Image
Image_000001
0
image : Image\Image_000001
database : The SiShield Database
annotation : SiShield 2015
width : 2144
height : 1424
depth : 3
****information of objectives****
name : damper
pose : frontal
truncated : 0
difficult : 0
xmin : 1052
ymin : 552
xmax : 1163
ymax : 608
*********************
name : damper
pose : frontal
truncated : 0
difficult : 0
xmin : 1165
ymin : 557
xmax : 1283
ymax : 636
*********************
name : damper
pose : frontal
truncated : 0
difficult : 0
xmin : 732
ymin : 533
xmax : 807
ymax : 584
*********************
name : tower
pose : frontal
truncated : 0
difficult : 0
xmin : 296
ymin : 418
xmax : 1007
ymax : 1413
*********************
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TonyHsuM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值