- 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></code></pre><p>第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。</p><p>第二行描述文档的根元素(像在说:" 本文档是一个便签")< p><p>接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body),子元素只有文本内容,<note>元素拥有属性和元素内容。</note></p><p>最后一行定义根元素的结尾:</p></note><p></p><p></p><p>父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞。所有的元素都可以有文本内容和属性(类似 HTML 中)。</p><h1>3.XML语法</h1><p>在 HTML 中,某些元素不必有一个关闭标签;在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签。</p><p>在 XML 中,XML 的属性值必须加引号。</p><pre><code><note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note></code></pre><p>在 HTML 中,常会看到没有正确嵌套的元素;在 XML 中,所有元素都必须彼此正确地嵌套。</p><pre><code><b><i>This text is bold and italic</i></b> 正确
<b><i>This text is bold and italic</i></b> 错误</code></pre><p>XML 中的注释:<!-- This is a comment --></p><h1>4.XML DOM</h1><p>DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法,把 XML 文档作为树结构来查看。</p><p>所有元素可以通过 DOM 树来访问。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。</p><h2>4.1python解析xml例子:</h2><pre><code><?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></code></pre><p>使用python脚本读取代码:</p><pre><code>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)
</code></pre><p>运行结果:</p><p><img src="https://img-blog.csdnimg.cn/49908344e3bd4466b49c7509109a5744.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5a6H6L-b6Zi25LmL6Lev,size_11,color_FFFFFF,t_70,g_se,x_16"></p><p>其中需要注意的是即使 XML 文件只包含一个元素,也必须指定数组索引 [0]。这是因为getElementsByTagName() 方法返回的是一个数组。</p><h2>4.2python创建xml例子</h2><p>doc.writexml():生成xml文档,将创建的存在于内存中的xml文档写入本地硬盘中,这时才能看到新建的xml文档</p><p>语法:<br>writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)</p><p>参数说明:<br>file:要保存为的文件对象名<br>indent:根节点的缩进方式<br>allindent:子节点的缩进方式<br>newl:针对新行,指明换行方式<br>encoding:保存文件的编码方式</p><pre><code>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()
</code></pre><p>运行显示结果:</p><p><img src="https://img-blog.csdnimg.cn/c2479bf335bd4a2cafb5ae47e4310fa8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5a6H6L-b6Zi25LmL6Lev,size_10,color_FFFFFF,t_70,g_se,x_16"></p><h2>4.3向xml中插入新的子元素</h2><pre><code>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')</code></pre><p>运行后显示效果:</p><p><img src="https://img-blog.csdnimg.cn/3662f4630bbc4e0fa41b8a2ea3dc3a72.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5a6H6L-b6Zi25LmL6Lev,size_9,color_FFFFFF,t_70,g_se,x_16"></p><p>我上传的代码链接:</p><p><a class="link-info has-card" href="https://download.csdn.net/download/wjzholmes/71956966" title="Python解析创建xml文件的代码https://download.csdn.net/download/wjzholmes/71956966"><span class="link-card-box"><span class="link-title">Python解析创建xml文件的代码https://download.csdn.net/download/wjzholmes/71956966</span><span class="link-link"><img class="link-link-icon" src="https://csdnimg.cn/release/blog_editor_html/release2.1.9/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=M7J4">https://download.csdn.net/download/wjzholmes/71956966</span></span>;</a></p>
Original: https://blog.csdn.net/wjzholmes/article/details/121920698
Author: 大宇进阶之路
Title: xml的学习和使用python解析读取xml文件
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/672331/
转载文章受原作者版权保护。转载请注明原作者出处!