xml的学习和使用python解析读取xml文件

2023-10-27

1. XML的介绍

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

和json类似也是用于存储和传输数据,还可以用作配置文件。

类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签是自行定义。

XML 和 HTML 为不同的目的而设计,HTML 旨在显示信息,而 XML 旨在传输信息。:

XML 被设计用来传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。

所以对 XML 最好的描述是:

XML 是独立于软件和硬件的信息传输工具。

2.XML的树结构

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。 

每一个元素有三个属性:tag、text、attrib

比如下面例子中,note是根元素,他的tag就是note,attrib属性是id=1,没有文本节点,有四个子元素。

<?xml version="1.0" encoding="UTF-8"?>
<note id="1>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。

第二行描述文档的根元素(像在说:"本文档是一个便签")

接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body),子元素只有文本内容,<note>元素拥有属性和元素内容。

最后一行定义根元素的结尾:</note>

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞。所有的元素都可以有文本内容和属性(类似 HTML 中)。

3.XML语法 

在 HTML 中,某些元素不必有一个关闭标签;在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签。

在 XML 中,XML 的属性值必须加引号。

<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

在 HTML 中,常会看到没有正确嵌套的元素;在 XML 中,所有元素都必须彼此正确地嵌套。

<b><i>This text is bold and italic</i></b> 正确
<b><i>This text is bold and italic</b></i> 错误

XML 中的注释:<!-- This is a comment -->

4.XML DOM

DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法,把 XML 文档作为树结构来查看。

所有元素可以通过 DOM 树来访问。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。

4.1python解析xml例子:

<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
 <book category="math">
	 <title>learning math</title>
	 <author>张三</author>
	 <pageNumber>561</pageNumber>
 </book>
 <book category="Python">
	 <title>learning Python</title>
	 <author>李四</author>
	 <pageNumber>600</pageNumber>
 </book>
</booklist>

使用python脚本读取代码:

import os
from xml.dom.minidom import parse

xml_file = r'D:\pythonProject\xml\book.xml'

    # print(xml_file)
#获取 xml 文档对象
domTree = parse(xml_file)
#获得根节点
rootNode = domTree.documentElement

# print('显示xml文档内容')
# print(rootNode.toxml())
# print('*'*10)

#判断根节点是否有属性
if rootNode.hasAttribute('type'):
    print('根节点的的type属性为:',rootNode.getAttribute('type'))
else:
    print('根节点没有属性')

book=rootNode.getElementsByTagName('book')
print('有%d个book节点'%len(book))

print(rootNode.getElementsByTagName('title')[0].childNodes[0].nodeValue)
print("rootNode.getElementsByTagName('title')[0] 是获取文档第一个title元素")
print("childNodes[0]是‘title'元素的第一个子元素,也就是文本节点")
print("nodeValue为获取节点的值")

print('*'*10)

for i in range(len(book)):
    print('\n显示第%d个book节点的内容:'%(i+1))
    print(rootNode.getElementsByTagName('book')[i].toxml())
    print()
    if rootNode.getElementsByTagName('book')[i].hasAttribute('category'):
            print('book节点的属性是:',book[i].getAttribute('category'))
        
    print('title的值:',book[i].getElementsByTagName('title')[0].childNodes[0].data)
    #从根节点写是print(rootNode.getElementsByTagName('book')[1].getElementsByTagName('title')[0].childNodes[0].data)
    
    print('author的值:',book[i].getElementsByTagName('author')[0].childNodes[0].data)
    #或者用childNodes[0].nodeValue
    # print('author的值:', book[i].getElementsByTagName('author')[0].childNodes[0].nodeValue)
    
    print('pageNumber的值:',book[i].getElementsByTagName('pageNumber')[0].childNodes[0].data)
    print('*' * 10)

运行结果:

 其中需要注意的是即使 XML 文件只包含一个元素,也必须指定数组索引 [0]。这是因为getElementsByTagName() 方法返回的是一个数组。

4.2python创建xml例子

doc.writexml():生成xml文档,将创建的存在于内存中的xml文档写入本地硬盘中,这时才能看到新建的xml文档

语法:
writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)

参数说明:
file:要保存为的文件对象名
indent:根节点的缩进方式
allindent:子节点的缩进方式
newl:针对新行,指明换行方式
encoding:保存文件的编码方式

import xml.dom.minidom

#在内存中创建一个空的文档
doc=xml.dom.minidom.Document()

#创建根元素
root=doc.createElement('booklist')
# print('添加的xml标签为:',root.tagName)

#设置根元素的属性
root.setAttribute('type','science and engineering')

#将根节点添加到文档对象中
doc.appendChild(root)

#创建子元素
book=doc.createElement('book')
#添加注释
book.appendChild(doc.createComment('这是注释'))

#设置子元素的属性
book.setAttribute('category','math')

#子元素中嵌套子元素,并添加文本节点
title=doc.createElement('title')
title.appendChild(doc.createTextNode('learning math'))
author=doc.createElement('author')
author.appendChild(doc.createTextNode('张三'))
pageNumber=doc.createElement('pageNumber')
pageNumber.appendChild(doc.createTextNode('561'))

#将子元素添加到boot节点中
book.appendChild(title)
book.appendChild(author)
book.appendChild(pageNumber)
#将book节点添加到root根元素中
root.appendChild(book)

#创建子元素
book=doc.createElement('book')
#设置子元素的属性
book.setAttribute('category','python')

title=doc.createElement('title')
title.appendChild(doc.createTextNode('learning python'))

author=doc.createElement('author')
author.appendChild(doc.createTextNode('李四'))
pageNumber=doc.createElement('pageNumber')
pageNumber.appendChild(doc.createTextNode('600'))

#将子元素添加到boot节点中
book.appendChild(title)
book.appendChild(author)
book.appendChild(pageNumber)
#将book节点添加到root根元素中
root.appendChild(book)

print(root.toxml())

fp= open(r'D:\pythonProject\xml\new.xml','w',encoding='utf-8')#需要指定utf-8的文件编码格式,不然notepad中显示十六进制
doc.writexml(fp,indent='',addindent='\t',newl='\n',encoding='utf-8')
fp.close()

运行显示结果:

 4.3向xml中插入新的子元素

import os
import xml.dom.minidom

from xml.dom.minidom import parse

#对book.xml新增一个子元素english,并删除math元素
xml_file = r'D:\pythonProject\xml\book.xml'

# #拿到根节点
domTree = parse(xml_file)
rootNode = domTree.documentElement

rootNode.removeChild(rootNode.getElementsByTagName('book')[0])

print(rootNode.toxml())

#在内存中创建一个空的文档
doc=xml.dom.minidom.Document()

book=doc.createElement('book')
book.setAttribute('category','english')
title=doc.createElement('title')
title.appendChild(doc.createTextNode('learning english'))
author=doc.createElement('author')
author.appendChild(doc.createTextNode('王五'))
pageNumber=doc.createElement('pageNumber')
pageNumber.appendChild(doc.createTextNode('328'))

book.appendChild(title)
book.appendChild(author)
book.appendChild(pageNumber)

math_book=rootNode.getElementsByTagName('book')[0]

#insertBefore方法  父节点.insertBefore(新节点,父节点中的子节点)
rootNode.insertBefore(book,math_book)
#appendChild将新产生的子元素在最后插入
# rootNode.appendChild(book)

print(rootNode.toxml())

with open(xml_file,'w',encoding='utf-8') as fh:
    domTree.writexml(fh,indent='',addindent='\t',newl='',encoding='utf-8')

 运行后显示效果:

我上传的代码链接:

Python解析创建xml文件的代码https://download.csdn.net/download/wjzholmes/71956966icon-default.png?t=M7J4https://download.csdn.net/download/wjzholmes/71956966

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xml的学习和使用python解析读取xml文件 的相关文章

  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件
  • android形状xml旋转可绘制以编程方式改变颜色

    这是三角形的 xml
  • 将 cXML 反序列化为 C# 类

    我正在尝试将 cXML 字符串反序列化为 C 类 但是 在反序列化时 除了根元素之外 我似乎无法获得任何东西来反序列化 如何反序列化 XML 文档 https stackoverflow com questions 364253 how t
  • 为什么在python中解析xml文件时会在文件中有“/>”的地方添加空格?

    当我解析 xml 文件然后将结果写入输出文件时 原始文件中存在 gt 的地方都会添加一个空格 有什么办法可以阻止它被创建吗 我编写了一些 python 代码来更新 xml 文件中的几个字段 并认为一切正常 但在原始文件和更新后的文件之间运行
  • 带单引号的 XPATH 查询[重复]

    这个问题在这里已经有答案了 有人知道如何解决这个问题吗 单引号让我陷入困境 nodes xml gt xpath item contains catalog Billy s Blogs title 我尝试以各种方式逃避它 但都抛出错误 no
  • 将新的 XElement 添加到 Xdocument

    我有以下代码 它成功写入 XML 文件 但是 由于进行了 tagRegistry Save 调用 它每次都会被覆盖 如何将新的 XElement 添加到现有文件 目前该文件只是被覆盖 public void saveTag if File
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 线性布局高度和重量

    我有以下内容
  • 如何使用 XPath 通过 CSS 类查找元素?

    我的网页里有一个div with a class named Test 我怎样才能找到它XPath 该选择器应该可以工作 但如果将其替换为适合的标记 则会更有效 contains class Test 或者 因为我们知道所寻找的元素是div
  • 从 XML 获取 viewCount [重复]

    这个问题在这里已经有答案了 我目前正在使用YouTube API https developers google com youtube 来自 Google 我正在尝试获取 viewCount 数组 我已经尝试过这个 但一点运气都没有 He
  • 如何让android BottomAppBar圆角化

    我正在使用BottomAppBar来自谷歌这样的
  • Blueimp jQuery 文件上传,传递额外的表单数据

    我可以使用一些帮助 我已经设法使 blueimp jQuery 文件上传为我工作 但我仍然绝对是一个新手 我对 jQuery 等知之甚少 所以请尝试将其清晰明了地提供给我尽可能简单 我会尝试具体一点 好的 我想实现的是人们可以上传照片 并为
  • 基本的 simpleXML 工作示例?

    看起来 PHP 中的 simpleXML 有很多问题 我在 Windows 上运行最新版本的 php 但无法让 simpleXML 的基本示例按照文档中的方式工作 我的 xml 文件是
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 如何在 Perl 中发送此 SOAP XML?

    我必须发送下面的 XML 我有no idea从哪儿开始 我知道我需要在 Perl 中查找 SOAP 但大致就是这样
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • Golang 结构的 XML 和 JSON 标签?

    我有一个可以根据 HTTP 请求标头输出为 JSON 或 XML 的应用程序 我可以通过将正确的标签添加到我正在使用的结构中来实现正确的输出 但我不知道如何为 JSON 和 XML 指定标签 例如 序列化以纠正 XML type Foo s
  • 在 Word 2010 中开发功能区选项卡,在组标签名称中使用 & 符号

    我正在开发一个用于模板的功能区选项卡 MyTemplate dotm 对于 Word 2010 我的问题 我想在组的标签中使用与号 我尝试了很多方法 也用谷歌搜索了很多关于这个问题的信息 但没有任何效果 named amp decimal

随机推荐