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
*********************
发布了13 篇原创文章 · 获赞 2 · 访问量 1844

猜你喜欢

转载自blog.csdn.net/SouthWooden/article/details/97911099