用python实现将json文件转化为xml格式

  1. 首先此json格式的标注来自于阿里天池竞赛 街景字符编码识别
  2. 其次json转xml的脚本不能万能的,因为每个json文件的内部会略有不同
  3. 此例的json内部格式如下
    在这里插入图片描述
    转化后的xml格式如下(就拿第一个标注举例)
    在这里插入图片描述

4.脚本文件如下

from xml.dom.minidom import parseString
import xml.dom.minidom
import os
import cv2
import json

_IMAGE_PATH = 'E:/coco/COCO/train'
_INDENT = '' * 4
_NEW_LINE = '\n'
_FOLDER_NODE = 'yaoganDataSet'
_ROOT_NODE = 'annotation'
_DATABASE_NAME = ''
_ANNOTATION = 'COCO2014'
_AUTHOR = 'li'
_SEGMENTED = '0'
_DIFFICULT = '0'
_TRUNCATED = '0'
_POSE = 'Unspecified'
_ANNOTATION_SAVE_PATH = 'Q:/tianchi_competition/Street_Recognization/Annotations'

# 封装创建节点的过程
def createElementNode(doc, tag, attr):  # 创建一个元素节点
    element_node = doc.createElement(tag)
    # 创建一个文本节点
    text_node = doc.createTextNode(attr)
    # 将文本节点作为元素节点的子节点
    element_node.appendChild(text_node)
    return element_node

def createChildNode(doc, tag, attr, parent_node):
    child_node = createElementNode(doc, tag, attr)
    parent_node.appendChild(child_node)

if __name__ == "__main__":
    json_path = "Q:/tianchi_competition/Street_Recognization/1/"
    img_path = "Q:/tianchi_competition/Street_Recognization/JPEGImages/"
    json_path1=os.path.join(json_path+'mchar_train.json')
    with open(json_path1, "r") as f:
        ann = json.load(f)
        for per_img_info in ann.items():
            per_img_name=per_img_info[0]
            saveName = per_img_name.strip(".png")
            saveName2=saveName+'.jpg'
            xml_file_name = os.path.join(_ANNOTATION_SAVE_PATH, (saveName + '.xml'))
            img = cv2.imread(os.path.join(img_path, saveName2))
            print(os.path.join(img_path, saveName2))
            # cv2.imshow(img)
            height, width, channel = img.shape
            print(height, width, channel)

            """创建xml框架"""
            my_dom = xml.dom.getDOMImplementation()
            doc = my_dom.createDocument(None, _ROOT_NODE, None)
            # 获得根节点
            root_node = doc.documentElement
            # folder节点
            createChildNode(doc, 'folder', _FOLDER_NODE, root_node)
            # filename节点
            createChildNode(doc, 'filename', saveName + '.png', root_node)
            print("正在创建各个结点中")
            # source节点
            source_node = doc.createElement('source')
            # source的子节点
            createChildNode(doc, 'database', _DATABASE_NAME, source_node)
            createChildNode(doc, 'annotation', _ANNOTATION, source_node)
            createChildNode(doc, 'image', 'flickr', source_node)
            root_node.appendChild(source_node)
            size_node = doc.createElement('size')
            createChildNode(doc, 'width', str(width), size_node)
            createChildNode(doc, 'height', str(height), size_node)
            createChildNode(doc, 'depth', str(channel), size_node)
            root_node.appendChild(size_node)
            # 创建segmented节点
            createChildNode(doc, 'segmented', _SEGMENTED, root_node)

            per_img_loc=per_img_info[1]
            num_label=per_img_loc['label']
            l=len(num_label)
            for i in range(l):
                xmin= per_img_loc['left']
                ymin= per_img_loc ['top']
                xmax=[]
                ymax=[]
                for m,n in zip(xmin,per_img_loc ['width']):
                    per_xmax=m+n
                    xmax.append(per_xmax)
                for p,q in zip(ymin,per_img_loc ['height']):
                    per_ymax=p+q
                    ymax.append(per_ymax )
                label=per_img_loc['label']

                # object节点
                object_node = doc.createElement('object')
                # object的子节点
                createChildNode(doc, 'name', str(label[i]), object_node)
                createChildNode(doc, 'pose', 'undefine', object_node)
                createChildNode(doc, 'truncated', 'undefine', object_node)
                createChildNode(doc, 'difficute', str(0), object_node)
                #创建object子节点bndbox的子节点
                bndbox_node = doc.createElement('bndbox')
                createChildNode(doc, 'xmin', str(xmin[i]), bndbox_node)
                createChildNode(doc, 'ymin', str(ymin[i]), bndbox_node)
                createChildNode(doc, 'xmax', str(xmax[i]), bndbox_node)
                createChildNode(doc, 'ymax', str(ymax[i]), bndbox_node)
                object_node.appendChild(bndbox_node)
                root_node.appendChild(object_node)
                i = i + 1

            with open('tmp.xml', 'w', encoding='utf-8') as f:
                    doc .writexml(f, indent='\t', addindent='\t', newl='\n', encoding="utf-8")
            f.close()
            fin = open('tmp.xml')
            fout = open(xml_file_name, 'w')
            lines = fin.readlines()
            for line in lines[1:]:
                if line.split():
                    fout.writelines(line)
            fin.close()
            fout.close()


踩过的坑:

cv2.imred() 只能读取.jpg格式的图片,其次括号中的路径不能有中文

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tomorrow;

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

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

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

打赏作者

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

抵扣说明:

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

余额充值