一文入门XML之实例解析

Posted Python数据分析实例

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文入门XML之实例解析相关的知识,希望对你有一定的参考价值。

点击关注上方“Python数据分析实例

设为“置顶或星标”,送达干货不错过

一、什么是 XML?

XML (eXtensible Markup Language)指可扩展标记语言,标准通用标记语言的子集,仅仅是纯文本,简称XML。

是一种用于标记电子文件使其具有结构性的标记语言。

是各种应用程序之间进行数据传输的最常用的工具。


  • XML 指可扩展标记语言(EXtensible Markup Language)

  • XML 是一种标记语言,很类似 html

  • XML 的设计宗旨是传输数据,而HTML做页面展示,显示数据

  • XML 标签没有被预定义。可自行定义标签。

  • XML 被设计为具有自我描述性。

  • XML 是 W3C 的推荐标准。


二、XML的用途?

xml被用于传输和存储数据及配置文件,应用于web开发。


三、XML的格式?

XML 树结构:形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。

XML 文档必须包含根元素,该元素是所有其他元素的父元素。


//1.声明信息,用户描述xml的版本和编码方式<?xml version="1.0" encoding="UTF-8?>
//2.根元素,有且仅有一个根元素,root
//3.xml大小写敏感
//4.标签成对,需要正确嵌套
//5.XML的属性值须加引号


什么是 XML 元素?

元素-由开始标签、元素内容和结束标签组成

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。

元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。

XML 元素是可扩展,以携带更多的信息。以下为嵌套元素,表示记录多个参数。

  
    
    
  
 <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-xxxx” coding="XXX" error="XXX"sample_time="YYYYMMDDHHMMSS">数据2</function>
    </meter>  


XML 命名规则?

  • 名称可以含字母、数字以及其他的字符

  • 名称不能以数字或者标点符号开始

  • 名称不能以字符 “xml”(或者 XML、Xml)开始

  • 名称不能包含空格



XML 属性?

XML 元素可以在开始标签中包含属性,类似 HTML。

属性 (Attribute) 提供关于元素的附加信息。采集点编码name与数据无关,但是对需要处理这个元素的程序来说是关键标识,起到标识xml元素的作用,毕竟一般xml包中同元素名记录不止一条。

<meter id="1001" name="000000000001" conn="conn"> xxx</meter> 

XML 属性值必须加引号,单引号和双引号均可使用。

<meter name="000000000001"

注释:如果属性值本身包含双引号,那么有必要使用单引号包围


使用属性的一些问题:

  • 属性无法包含多重的值(元素可以)

  • 属性无法描述树结构(元素可以)

  • 属性不易扩展(为未来的变化)


尽量使用元素来描述数据。


有效的XML文档?
首先必须是格式良好的。使用DTD和XSD(XML Schema)定义约束,在此不作详细介绍。



四、一个 XML 文档实例


实例树结构如下图:


一文入门XML之实例解析

作图工具网址:https://app.diagrams.net/


例子中的根元素是 <root>。文档中的所有 <common> 元素、 <data> 元素都被包含在<root> 中。

<common> 元素有 3 个子元素:<building_id>、< gateway_id>、<type>。

<data> 元素有 5个子元素:<sequence>、< parser>、<time>、<meter>、<function>。

<?xml version="1.0" encoding="UTF-8"?> <!--声明:定义xml版本和编码信息-->
<root> 
<!--通用部分--> 注释
<!--
 building_id:建筑编号
 gateway_id:采集器编号
 type:远传数据包的类型,设置为“report” -->
  <common> 
    <building_id>xxxxxx</building_id>  
    <gateway_id>01</gateway_id>  
    <type>report</type
  </common> 

<!--能耗远传--> 注释
<!--操作类型:report:采集器定时上报的数据
元素有5种类型:
1、sequence元素:采集器向服务器发送数据的序号
2、parser元素:向服务器发送的数据是否经采集器解析过
3、time元素:数据采集时间
4、meter元素:计量装置的设备号,具有id、name属性,每个计量装置编号需不同
5、function元素:每个计量装置的具体采集功能,具有下列4种属性:
            id属性:计量装置的数据采集功能编号(供多功能电能表使用)
            name属性:为所属计量装置编号-采集参数编号,注意正向有功电能必须加后缀“-1090”
            coding属性:能耗数据分类/分项编码
            error属性:该功能出现错误的状态码,192表示没有错误,0表示计量装置离线
            sample_time属性:采集时间-->
  <data operation="report"
    <sequence>25</sequence>  
    <parser>yes</parser>  
    <time>20210115180000</time> 
    
    <meter id="1001" name="000000000001" conn="conn"
      <function id="1" name="000000000001-1090" coding="01A10" error="192" sample_time="20210115175909">数据1</function
      <function id="2"name=”000000000001-xxxx” 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-xxxx” coding="XXX" error="XXX"sample_time="YYYYMMDDHHMMSS">数据2</function>
    </meter>  
  </data> 
</root>


五、xml解析技术(读写操作)

Python有非常非常多的工具来处理 XML。常见的xml解析技术:

1、DOM解析
官方提供的解析方式,基于xml树解析。

2、SAX解析
基于事件的解析,适用于数据量较大的XML.

3、ET解析 

xml.etree.ElementTree模块,简称ET。无须加载整个文档到内存,轻量级API,本次以它来演示解析过程。

4、DOM4J解析
第三方,开源免费,是JDOM的升级版,使用接口。

5、lxml解析并结合XPath提取元素

可参考以往推文:


  • 读取xml文件

import pandas as pd 
import xml.etree.ElementTree as ET
    
pd.set_option("expand_frame_repr",False)
def read_xml(xmlFileName):
    with open(xmlFileName, 'r') as xml_file:
        #读取数据,以树结构存储
        tree = ET.parse(xml_file)

        # 提取树根节点
        root = tree.getroot()

        # 返回DataFrame数据
        return pd.DataFrame(list(iter_records(root))).T
        
def iter_records(root): #生成器方法,每次调用返回一对值,直到循环结束
    '''
        解析所有记录
    '
''
    for data in root.iter(tag='data'):
        
        # 保存字典
        temp_dict = {} 
        # 遍历所有字段
        for meter in data:
            
            for function in meter:
                temp_dict[function.attrib['name']] = function.text

        # 生成值
        yield temp_dict

# XML数据源路径
r_filenameXML = r'..data.xml'
#解析数据
xml_read = read_xml(r_filenameXML)
xml_read.to_excel(r".. est.xlsx")
print(xml_read.head(20))


找到感兴趣的元素?

Element 对象有一个 iter 方法可以对子结点进行深度优先遍历。ElementTree 对象也有 iter 方法来提供便利。

<common> 元素、 <data> 元素都被包含在<root> 中,如果我们仅对<data> 元素

内数据感兴趣,遍历所有的元素,然后 iter 方法接受一个标签名字,然后只遍历指定标签的元素。

for data in root.iter(tag='data'):


一个更加有效的办法是使用 XPath 支持。
可参考推文
Element 有一些关于寻找的方法可以接受 XPath 作为参数。find 返回第一个匹配的子元素, findall 以列表的形式返回所有匹配的子元素, iterfind 为所有匹配项提供迭代器。这些方法在 ElementTree 里面也有。

  
    
    
  
  • 创建XML文件

以下简单演示创建xml数据包
当然实际更复杂一点,XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。一般使用数据库的名称规则来命名 XML 文档中的元素。从数据库获取数据,根据表结构特点,提取处理相关数据插入到xml文件的指定位置,打包成xml包。
w_filenameXML =r'.Desktop	est	est.xml'
def write_xml(xmlFileName, data):

    # 以写入打开文件
    with open(xmlFileName, 'w') as xmlFile:

        # 写入头部
        xmlFile.write('<?xml version="1.0" encoding="UTF-8"?> ')

        xmlFile.write('<root> ')

        # 写数据
        xmlFile.write(' '.join(data.apply(xml_encode, axis=1)))

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

def xml_encode(row):

    # 标记data节点开始标签
    xmlItem = ['<data>']

    # 给行中每个字段加固定xml格式
    for field in row.index:
        xmlItem.append('<meter name="{0}">{1}</meter>'.format(field, row[field]))
    
    # 标记data节点结束标签
    xmlItem.append('</data>')

    # 返回字符串
    return ' '.join(xmlItem)


# 写入xml格式文件
write_xml(w_filenameXML, xml_read)

后数据创建完成后,为保证数据的安全,还需加密处理才能通过网络远程传输。

参考:https://www.w3school.com.cn/xml/xml_elements.asp



本文测试xml数据包后台回复【xml】
  
    
    
  
这是一个能学到技术的公众号,欢迎关注

Python数据分析实例   

长按二维码,关注我的公众号

微信改版,快快设为 星标
记得点在看

以上是关于一文入门XML之实例解析的主要内容,如果未能解决你的问题,请参考以下文章

一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

XML-入门级

一文XML简单入门

目标检测一文干翻xml文件的读取

Android之DOM解析XML