前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中XML数据结构详细解析

Python中XML数据结构详细解析

作者头像
用户8949263
发布于 2022-04-08 05:07:41
发布于 2022-04-08 05:07:41
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

前言

物联网应用过程中,设备采集数据后,一般通过终端采集器网关转发或web server服务打包成xmljson数据格式传输到数据中心或云平台,最后经数据解析、数据分析数据可视化。开发环节涉及末端设备数据采集、数据转发、数据解析等流程。

本文实际业务场景:本文主要介绍两种常见的数据包格式及使用方法,这里主要介绍xml实际应用,包括对采集数据如何打包、入库、解析。结合实际代码示例演示。

JSON与XML简介

JSON是一种轻量级的数据交换格式,易于阅读和编写。同时便于机器解析和生成。xml作为常见的数据格式,物联网应用中依然常见。XML可扩展标记性语言是一种非常常用的文件类型,主要用于存储和传输数据。

1.XML是web中交换和传输数据中最常用的格式之一,很多的web server协议都是基于XML进行定义。

2.JSON和XML是web传输中常见的两种文本格式。相比JSON,XML格式严格规范,更容易传输更加复杂的数据。

3.XML天生有很好的扩展性;XML有丰富的编码工具,Python解析xml常见的三种方法:DOM、sax及ElementTree。DOM将整个xml读入内存并解析为树,缺点占用内存大且解析慢,优点可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点需要自己处理事件。

4.JSON具有简单直观;可以直接与JavaScript、Python等语言中的对象兼容;作为数据包格式传输的时候具有更高的效率(不像XML有闭合标签,节省资源)。

JSON与XML数据格式

  • Json数据格式

名称/值对,数据由逗号分隔,花括号保存对象,方括号保存数组。Json的值可以为数字、字符串、逻辑值、数组(在方括号中)、对象(在花括号中)、null

代码语言:javascript
代码运行次数:0
运行
复制
 json对象在花括号中书写,可以包含多个名称、值对,如

{“name”:“server1”,“value”:30}

json的数组在方括号中书写,可包含多个对象,如

{“server”:[{"name":"server2","value":30},{"name":"server2","value":40},{"name":"server3","value":50}]}

json模块操作JSON格式

Python的json模块序列化和反序列化的过程分别为encoding和decoding。序列化serialization就是将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以为JSON、xml等。反序列化就是从存储区域读取反序列化对象的状态,并重新创建该对象。

1、encoding编码:把一个Python对象编码转换为JSON字符串。

1)json.dumps()

格式化数据:indent参数缩进,是的存储数据格式更优雅,增强可读性。

压缩数据:JSON主要作为一种数据通信的格式存在,网络数据很在乎数据大小的,无用的空格会占据很多通信带宽,所以需要对数据进行压缩。separator参数,该参数传递的是一个元组,包含分隔对象的字符串。

Python数据类型转JSON转换对照表

代码语言:javascript
代码运行次数:0
运行
复制
dict--->object,list
tuple--->array,str
unicode--->string,int
float--->number
True--->true
False--->false
None--->null

2)json.dump()

将python的数据对象转换成JSON数据并写入文件。

代码语言:javascript
代码运行次数:0
运行
复制
import json
data={"a"1"b"2}
with open('dump.json','w'as f:
    json.dump(data,f)

2、decoding解码:把JSON格式化字符串编码转换为Python对象。

1)json.loads()

解码JSON数据并返回Python字段的数据类型。

代码语言:javascript
代码运行次数:0
运行
复制
import json

org_json='{"a":1,"b":2}'

decode_json=json.loads(org_json)

decode_json["a"]

2、json.load()

从json数据文件中读取数据,并将Json编码的字符串转换为Python

的数据结构。

代码语言:javascript
代码运行次数:0
运行
复制
import json

with open("dump.json",'r'as f:

   data= json.load(f)

json详细介绍可参考推荐阅读文章

  • xml数据格式
代码语言:javascript
代码运行次数:0
运行
复制
<root>
    <animal id='1'>
         <name>dog</name>
         <age>2</age>
    </animal>
    <animal id='2'>
         <name>tiger</name>
         <age>3</age>
    </animal>
</root>


XML具有以下特征:

1、由标签对组成:<root></root>
2、标签可以有属性:<animal id='1'>
3、标签对可以嵌入数据:<name>tiger</name>
4、标签可以注入子标签,具有层次关系

<root>
    <animal >
    </animal>
</root>

扩展1:已有xml包+指定节点解析

测试xml数据包

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
  <common> 
    <building_id>xxxxxx</building_id>  
    <gateway_id>01</gateway_id>  
    <type>report</type> 
  </common> 

  <data operation="report"> 
    <sequence>25</sequence>  
    <parser>yes</parser>  
    <time>20210115180000</time> 
    
    <meter id="1" name="000000000001" conn="conn">
      <function id="1" name="000000000001-1090" coding="01A10" error="192" sample_time="20210115175909">数据1</function> 
      <function id="2" name="000000000001-1200" coding="XXX" error="XXX" sample_time="YYYYMMDDHHMMSS">数据2</function>
    </meter>  
    
    <meter id="2" name="000000000002" conn="conn"> 
      <function id="1" name="000000000002-1090" coding="01A10" error="192" sample_time="20210115175900">数据1</function> 
      <function id="2" name="000000000002-1200" coding="XXX" error="XXX" sample_time="YYYYMMDDHHMMSS">数据2</function>
    </meter>

  </data> 
</root>

解析代码

代码语言:javascript
代码运行次数:0
运行
复制
#导入解析模块
import xml.etree.ElementTree as ET
#加载xml文件
root=ET.parse("test.xml")
# animal_node=root.getiterator("meter")  #过时
#获取指定节点
meter_node=root.getroot().iter(tag="meter")

def iter_records(meter_node):

    for node in meter_node:
        # 保存字典
        temp_dict = {}
        # animal_node_child = node.getchildren()[0]   #方法过时
        for i in range(len(node)):
            #方法一:
            meter_node_child=[i for i in node][i]
            #方法二
            # meter_node_child=list(node)[i]
            # print(meter_node_child)
            print(meter_node_child.tag+"\n"+"name:"+meter_node_child.attrib["name"]+":"+meter_node_child.text)

            temp_dict[meter_node_child.attrib['name']] = meter_node_child.text

            # 生成值
        yield temp_dict

print(list(iter_records(meter_node)))

扩展2:已有xml包+所有节点解析

代码语言:javascript
代码运行次数:0
运行
复制
import xml.etree.ElementTree as ET
# # #加载xml文件
root=ET.parse("test.xml")

# #获取指定节点
meter_node=root.findall("data")

for meter in meter_node:
    # 保存字典
    lst=[{i.tag: i.text} for i in meter[0:3]]
    for node in meter[3:]:
        meter_node_child = list(node)
        k=[{meter_node_child[i].attrib["name"]:meter_node_child[i].text} for i in range(len(node))][0]
        lst.append(k)
print(lst)

扩展3:xml包创建+格式化输出

代码语言:javascript
代码运行次数:0
运行
复制
import xml.etree.ElementTree as ET
#格式化数据包
def write_xml():
    # 创建elementtree对象,写入文件
    root=xml_encode()
    tree = ET.ElementTree(root)
    tree.write("new1.xml")
    with open(r'new1.xml', 'r', encoding="utf-8") as file:
        with open(r'new2.xml', 'w+', encoding="utf-8") as xml_file:
            # 用open()XML文件中的内容读取为字符串再转成UTF-8
            xmlstr = file.read().encode('utf-8')
            import xml.dom.minidom
            xml = xml.dom.minidom.parseString(xmlstr)
            xml_pretty_str = xml.toprettyxml()
            print(xml_pretty_str)
            xml_file.write(xml_pretty_str)
    return xml_pretty_str
    
#创建xml
def xml_encode():
    # 创建根节点
    root=ET.Element("root",encoding="utf-8")
    #创建子节点sub1,并为其添加属性
    sub1=ET.SubElement(root,"data")
    sub1.attrib={"operation":"report"}

    #创建子节点sub2,并为其添加数据
    sub2=ET.SubElement(sub1,"meter")
    sub2.attrib={"name":"000000000001"}

    #创建子节点sub3,并为其添加数据
    sub3=ET.SubElement(sub2,"function")
    sub3.attrib={"name":"000000000001-1090"}
    sub3.text="数据1"

    return root

write_xml()

扩展4:外部数据+xml创建

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd

def write_xml(data):

    # 以写入打开文件
    with open("new2.xml", 'w') as xmlFile:
        # 写入头部
        xmlFile.write('<?xml version="1.0" encoding="UTF-8"?>\n')

        xmlFile.write('<root>\n')
        body=xml_encode(data)

        # 写数据
        xmlFile.write(body)

        # 写尾部
        xmlFile.write('\n</root>')

def xml_encode(data):
    # 标记data节点开始标签
    xmlItem = ['<data operation="report">']
    # 列表追加,回车成多行
    for i in data.index:
        coding = data.iloc[i][0]
        value = data.iloc[i][1]
        #输入替换的模板:给行中每个字段加固定xml格式
        str_xml = """<meter name="{0}"><function name="{0}-1090">{1}</function></meter>""".format(coding,value)
        xmlItem.append(str_xml)
    # 标记data节点结束标签
    xmlItem.append('</data>')
    # 返回字符串
    xml_str = '\n'.join(xmlItem)  # list 更新成str
    print(xml_str)
    return xml_str

if __name__ == '__main__':
    #测试数据
    data=pd.DataFrame({"name":["00001","00002"],"value":[20,30]})
    #生成数据包
    write_xml(data)

扩展5:外部数据+xml入库

首先在数据库建立测试表xml_data,三个字段ID:记录id、xmlDatetime:插入时间、xmlData:xml数据包内容

将xml插入数据库,其中数据库连接方法get_conn,见推文:

跨库数据备份还原、迁移工具

代码语言:javascript
代码运行次数:0
运行
复制
from datetime import datetime
from tools import get_conn

#数据导入
def xml_sync_to_sqlserver():
    """
    xml数据同步到sqlserver数据库里面
    """
    xmlDatetime = datetime.now()
    conn = None
    try:
        conn = get_conn('LOCAL')
        with conn:
            # 数据文件导入
            with conn.cursor() as cur:
                with open(f'new2.xml', mode='r', encoding='utf-8') as file:
                    xmlData = file.read().rstrip()
                    sql = """insert into xml_data(xmlDatetime,xmlData) values (%s,%s)"""
                    print("插入成功")
                    cur.execute(sql,(xmlDatetime,xmlData))
            conn.commit()

    finally:
        if conn:
            conn.close()
        end =datetime.now()
        s = (end - xmlDatetime).total_seconds()
        print('数据导入: %s, 耗时: %s 秒' % (xmlDatetime, s))

后期将推出xml数据实际变更修改问题以及数据网络传输,敬请期待!

文中包含所有代码,快动手尝试一下吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据分析实例 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Python修改XML实例应用场景
继上一篇介绍了xml实际应用,包括对采集数据如何打包、入库、解析。本文继续结合实际需求详细介绍xml数据包如何修改。
用户8949263
2022/04/08
8640
python xml模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
py3study
2018/08/02
5750
python处理xml
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
菲宇
2019/06/11
1.5K0
Python模块知识7:XML
XML是实现不同语言或程序之间进行数据交换的协议; 通常浏览器返回的字符串有三种格式: 1、HTML 2、Json 3、XML 其中,XML可以在页面上做展示,可以作为程序的配置文件(获取字符串类型的XML格式数据) xml的特点:以开始和结尾,包含根节点、子节点; 每一个节点都是element对象,节点下可以嵌套节点,element对象下可以获得各个方法。比如:tag(节点名称)、attib(属性)、text(内容)、makeelement(创建一个新节点)、append(追加一个子节点)等 如下所示的x
企鹅号小编
2018/01/11
6850
Python模块知识7:XML
Python - xml模块
标签>>: country 、标签属性>>: {'name': 'Panama'}
py3study
2020/01/10
7370
Python - xml模块
数据分析从零开始实战 (三)
前面两篇文章基础篇(一)和基础篇(二)讲了数据分析虚拟环境创建和pandas读写csv、tsv、json格式的数据,今天我们继续探索pandas读取数据。 本系列学习笔记参考书籍:《数据分析实战》托马兹·卓巴斯
龙哥
2020/02/13
1.4K0
数据分析从零开始实战 (三)
Python - DOM操作XML技巧汇总
DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。HTML DOM 定义了访问和操作 HTML 文档的标准方法。将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。
为为为什么
2022/08/04
1.9K1
Python - DOM操作XML技巧汇总
三十二、python操作XML文件
''' XML:模块 xml总结 1、解析 str 文件 tree,ElementTree,type root,Element,type 2、操作 Element: tag,text,find,iter,get,set... 3、重新写入 tree.write() str没有tree--->ElementTree(root) tree.write(xx,encoding='utf-8',xxx,xxx) 4、创建xml Eleme
py3study
2020/01/08
9950
Python23 内置模块讲解
参考博客http://www.cnblogs.com/alex3714/articles/5161349.html
py3study
2020/01/09
1.8K0
Python23 内置模块讲解
python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用
xml.etree.ElementTree模块实现了一个简单而有效的用户解析和创建XML数据的API。
Hongten
2018/09/13
8360
python处理testlink
在软件活动中,我们需要对测试用例进行管理,如果只用excel,不用管理工具系统的管理,那么将出现以下一些问题: 案例文件分散,测试进度不透明; 需求变更导致的测试计划/测试用例变更,未能及时通知相关测试人员; 版本管理困难,很难追踪版本的变化; 缺陷管理与测试用例管理脱节,不便于缺陷密度的分析; 产品需求、测试计划、测试用例未能建立关联,不便于测试过程管理; 缺乏相关的测试分析报告数据,不便于暴露测试风险;
赵云龙龙
2019/09/03
2.1K0
python处理testlink
Python学习--xml-Elemen
当你需要解析和处理 XML 的时候,Python 表现出了它 “batteries included” 的一面。 标准库 中大量可用的模块和工具足以应对 Python 或者是 XML 的新手。
py3study
2020/01/07
8480
了解女朋友的心还不如了解Python之在Python中解析和修改XML
工作中我们时常需要解析用不同语言编写的数据。Python 提供了许多库来解析或拆分用其他语言编写的数据。在这篇 Python XML 解析器教程的文章中,你可以学习怎么样通过 Python 解析 XML。
查理不是猹
2021/12/15
1.8K0
Python 进阶(八):XML 基本操作
XML(Extensible Markup Language)中文译为可扩展标记语言,它是一种简单、灵活、易扩展的文本格式,它主要关注数据内容,常用来传送、存储数据。
Python小二
2020/08/18
6450
Python 进阶(八):XML 基本操作
常用模块补充,内置函数,异常处理
shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中
py3study
2020/01/19
1.6K0
常用模块补充,内置函数,异常处理
Python 操作XML文件一文通
我们经常需要解析用不同语言编写的数据,Python 提供了许多第三方库来解析或拆分用其他语言编写的数据,今天我们来学习下 Python XML 解析器的相关功能。
周萝卜
2022/12/27
1.9K0
Python 操作XML文件一文通
Python XML解析
----http://www.w3cschool.cn/python/python-xml.html
py3study
2020/01/10
2.4K0
【Python】解析 Xml 格式的文档
注意:xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全。
杨丝儿
2022/02/25
1.9K0
关于带命名空间的中文XML的解析
本来感觉XML文件解析是一件很简单的事情,结果折腾了一两周没什么进展,直到昨天才陆陆续续找到了一些解决方案,现在把踩坑过程和解决过程一并叙说一遍。
python与大数据分析
2022/03/11
7230
[接口测试 - 基础篇] 05 好讨厌的xml解析
概述 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据。 XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。 xml构成 XML由3个部分构成,它们分别是: 文档类型定义(Document Type Definition,DTD),即XML的布局语言 可扩展的样式语言(Extensible Style
苦叶子
2018/04/09
9850
相关推荐
Python修改XML实例应用场景
更多 >
目录
  • 前言
  • JSON与XML简介
  • JSON与XML数据格式
  • json详细介绍可参考推荐阅读文章
  • 扩展1:已有xml包+指定节点解析
  • 扩展2:已有xml包+所有节点解析
  • 扩展3:xml包创建+格式化输出
  • 扩展4:外部数据+xml创建
  • 扩展5:外部数据+xml入库
  • 跨库数据备份还原、迁移工具
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验