我的编程空间,编程开发者的网络收藏夹
学习永远不晚

xml解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

xml解析

XML 指可扩展标记语言(eXtensible Markup Language)。XML 被设计用来传输和存储数据。而HTML被用来显示数据。

XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

Python对XML解析有三种方式:SAX,DOM,以及ElementTree。

SAX (simple API for XML )

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数。本文使用用ElementTree方式,以名称规范档的下载文本为例。

在ElementTree中,具体节点的方法主要包括

tag(标签) attrib(属性) find(寻找节点) set(设置属性) iter(遍历节点) get(获取节点)

解析XML

from xml.etree import ElementTree as ET
#第一种方式

# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read()

# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)


from xml.etree import ElementTree as ET
#第二种方式

# 直接解析xml文件
tree = ET.parse("xo.xml")

# 获取xml文件的根节点
root = tree.getroot()

操作XML

遍历XML文档的所有内容

from xml.etree import ElementTree as ET

# 直接解析xml文件
tree = ET.parse("test.xml")

# 获取xml文件的根节点
root = tree.getroot()


### 操作

# 顶层标签
print(root.tag)


# 遍历XML文档的第二层
for child in root:
    # 第二层节点的标签名称和标签属性
    print(child.tag, child.attrib)
    # 遍历XML文档的第三层
    for i in child:
        # 第二层节点的标签内容
        print(i.text)

遍历XML中指定的节点

from xml.etree import ElementTree as ET

# 直接解析xml文件
tree = ET.parse("test.xml")

# 获取xml文件的根节点
root = tree.getroot()

# 顶层标签
print(root.tag) 

# 遍历XML中所有的属性名节点
for node in root.iter('属性名'):
    # 节点的标签名称和内容
    print(node.text)

修改节点内容

xml解析中,要注意修改或者写出XML文件都是在内存中进行,如果要在文件中保存修改,要使用tree的write()方法。set()可设置属性,remove()可删除制定节点,例:
# 直接解析xml文件
tree = ET.parse("xo.xml")

# 获取xml文件的根节点
root = tree.getroot()

############ 操作 ############

# 顶层标签
print(root.tag)

# 循环所有的year节点
for node in root.iter('year'):
    # 将year节点中的内容自增一
    new_year = int(node.text) + 1
    node.text = str(new_year)

    # 设置属性
    node.set('name', 'alex')
    node.set('age', '18')
    # 删除属性
    del node.attrib['name']


############ 保存文件 ############
tree.write("newnew.xml", encoding='utf-8')

创建XML文档

方式一

from xml.etree import ElementTree as ET


# 创建根节点
root = ET.Element("famliy")


# 创建节点大儿子
son1 = ET.Element('son', {'name': '儿1'})
# 创建小儿子
son2 = ET.Element('son', {"name": '儿2'})

# 在大儿子中创建两个孙子
grandson1 = ET.Element('grandson', {'name': '儿11'})
grandson2 = ET.Element('grandson', {'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2)


# 把儿子添加到根节点中
root.append(son1)
root.append(son1)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

方式二

from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("famliy")


# 创建大儿子
# son1 = ET.Element('son', {'name': '儿1'})
son1 = root.makeelement('son', {'name': '儿1'})
# 创建小儿子
# son2 = ET.Element('son', {"name": '儿2'})
son2 = root.makeelement('son', {"name": '儿2'})

# 在大儿子中创建两个孙子
# grandson1 = ET.Element('grandson', {'name': '儿11'})
grandson1 = son1.makeelement('grandson', {'name': '儿11'})
# grandson2 = ET.Element('grandson', {'name': '儿12'})
grandson2 = son1.makeelement('grandson', {'name': '儿12'})

son1.append(grandson1)
son1.append(grandson2)


# 把儿子添加到根节点中
root.append(son1)
root.append(son1)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

方式三

from xml.etree import ElementTree as ET


# 创建根节点
root = ET.Element("famliy")


# 创建节点大儿子
son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
# 创建小儿子
son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})

# 在大儿子中创建一个孙子
grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
grandson1.text = '孙子'


et = ET.ElementTree(root)  #生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)

名称规范档文本

名称规范档没有提供批量下载同一人物的接口,在数据量大的实验需求中,设计实现了处理批量文本的方法。

首先,在下载的同一文档中包含不同ID号的多条人物数据,分别以 开头,以结尾,因此第一步,逐行读取文本,匹配结尾标识符“\n”,匹配成功则将先前读取的xml文档写出到新的文件,并给与新的命名以区别不同文本,实现代码如下:

def file_seperate(file_path,to_path):
    for fileName in os.listdir(file_path):
        f1 = open(file_path+"/"+fileName,'r',encoding="utf-8")
        # print(file_path+"/"+fileName)
        text = ""
        num = 1
        for content in f1.readlines():
            text += content
            if "</collection>"+"\n" == content:
                num_str = str(num)
                f2 = open(to_path + "/0" + num_str + fileName ,'w',encoding="utf-8")            
                f2.write(text)
                f2.close()
                text = ""
                num = num + 1
        f1.close()

解析结果可得(以沈从文为例)01沈从文.xml、02沈从文.xml、03沈从文.xml,进一步分析,在每一篇XML文件,要获取具体属性值构建目标文本集,为进一步的数据处理提供依据。根据研究需要,获取xml文件中的collection>>record>>datafield>>subfield字段,并限定具体属性的subfield字段,如{'code': 'a'}、{'code': 'f'}、 {'code': '3'}、{'code': 'u'},循环读取进行匹配,匹配成功则构建新的目标文本,与原文本同名。实现代码如下:

def xml_parse(file_path,Target_path):
    for fileName in os.listdir(file_path):
        file = file_path+"/"+fileName
        text = ''

        tree = ET.parse(file)
        root = tree.getroot()
        for node in root:
            for node_node in node:
                if node_node.attrib == {'tag': '200', 'ind1': ' ', 'ind2': '0'} or node_node.attrib =={'tag': '400', 'ind1': ' ', 'ind2': '0'} or node_node.attrib =={'tag': '810', 'ind1': ' ', 'ind2': ' '} or  node_node.attrib =={'tag': '830', 'ind1': ' ', 'ind2': ' '} or node_node.attrib =={'tag': '856', 'ind1': '4', 'ind2': ' '}:
                    for subfield in node_node:
                        if subfield.attrib == {'code': 'a'} or subfield.attrib == {'code': 'f'} or subfield.attrib == {'code': '3'} or subfield.attrib == {'code': 'u'}:
                            text = text + subfield.text

        print(text)
        f = open(Target_path+"/"+fileName,'w',encoding='utf-8')
        f.write(text)
        f.close()

主函数如下,分别设定原始路径,处理文件路径,目标文件路径:

if __name__ == "__main__":
    path_Source = "D:/study/name_cluster/test/test02/data-Source"
    path_Separate = "D:/study/name_cluster/test/test02/data-Separate"
    path_Target = "D:/study/name_cluster/test/test02/data-Target"
    file_seperate(path_Source,path_Separate)        
    xml_parse(path_Separate,path_Target)

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

xml解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

xml解析

XML 指可扩展标记语言(eXtensible Markup Language)。XML 被设计用来传输和存储数据。而HTML被用来显示数据。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,
2023-01-30

Python 解析XML

Python中对两种解析方式的解释:The Python standard library provides a minimal but useful set of interfaces to work with XML.The two m
2023-01-31
2024-04-02

Python XML解析

Python XML解析----http://www.w3cschool.cn/python/python-xml.htmlPython中使用ElementTree对XML文件进行解析----http://www.jianshu.com/p
2023-01-31

Python XML解析之Element

参考网址:http://www.runoob.com/python/python-xml.htmlhttps://docs.python.org/2/library/xml.etree.elementtree.html菜鸟教程提供了基本的X
2023-01-30

java怎么解析XML

本篇内容主要讲解“java怎么解析XML”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java怎么解析XML”吧!目录XML的主要用途对比HTML关于XML文件的解析?JDK自带的一套解析XML
2023-06-20

Python xml解析记录

Python的xml解析方式自带的有3种,xml.dom.*、xml.sax.*以及xml.etree.ElementTree,相对来说,xml.etree.ElementTree最快捷方便。因为自己只使用了xml.etree.Elemen
2023-01-31

Python XML解析之DOM

DOM说明:DOM:Document Object Model APIDOM是一种跨语言的XML解析机制,DOM把整个XML文件或字符串在内存中解析为树型结构方便访问。https://docs.python.org/2/library/xm
2023-01-30

python xml解析实例详解

python xml解析 first.xml 1 fsy 24 2
2022-06-04

Python中怎么解析XML

本篇文章给大家分享的是有关Python中怎么解析XML,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python解析XML代码示例:< text > < font size="
2023-06-17

Python解析XML字符串

# -*- coding: utf-8 -*-    import xml.sax  import xml.sax.handler    class XMLHandler(xml.sax.handler.ContentHandler):  
2023-01-31

Python中如何解析XML

Python中如何解析XML,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是XML?XML是可扩展标记语言(Extensible Markup Langua
2023-06-17

Java如何解析 XML 文档

本教程详细介绍了使用Java解析XML文档的两种主要方法:DOM解析和SAX解析。DOM解析:将整个XML文档加载到内存中,创建一棵树形表示文档结构。它适合需要随机访问文档各个部分的情况。SAX解析:按顺序处理XML文档事件,比DOM解析器更快,因为它不会将整个文档加载到内存中。适合需要按顺序处理文档的情况。
Java如何解析 XML 文档
2024-04-02

Hibernate XML格式怎么解析

这篇文章主要讲解了“Hibernate XML格式怎么解析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate XML格式怎么解析”吧!1.如何解析XML文件映射文件是Hiber
2023-06-17

PHP如何解析 XML 文档

本文讲解了PHP解析XML文档的三种方法:DOM、SAX和SimpleXML。DOM提供了灵活的操作文档的能力,SAX速度更快,SimpleXML使用更简单。选择最合适的解析器取决于应用程序的需求。DOM适合需要灵活性和操作文档的能力,SAX适合需要速度和内存效率,SimpleXML适合需要简单性和易用性的应用程序。
PHP如何解析 XML 文档
2024-04-02

Python如何解析 XML 文档

本文详解Python解析XML文档的方法,包括ElementTree、SAX、lxml和minidom。选择解析器取决于特定需求,如文档大小、自定义要求和高级功能(如XPath)。ElementTree简单易用,适合中小文档;SAX高效,适用于大型文档;lxml功能强大,支持高级功能;minidom提供DOM树直接访问。
Python如何解析 XML 文档
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录