热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

xmldomminidom

一.xml相关术语:1.Document(文档):对应一个xml文件2.Declaration(声明):vers

一. xml相关术语:

1.Document(文档): 对应一个xml文件

2.Declaration(声明):

xml version="1.0" encoding="utf-8"?>

version指定了版本,encoding指定了文件编码

3.Comment(注释),同html中的注释

4.Element(元素):指的是从( 且包括) 开始标签直到
( 且包括) 结束标签的部分,如

<book_store name&#61;"newhua" website&#61;"https://www.amazon.cn/b?node&#61;1876097071"><book1><name>hamletname><author>William Shakespeareauthor>book1>
book_store>

5.Tag(标签): 用于表示素的起始与结束&#xff0c;如book1,name,author等

6.Attribute(属性),如上面的name,website

7.Text(文本),如hamelt

 

二.解析xml

有三种方法

from xml.dom.minidom import parse,parseStringdom1 &#61; parse(&#39;test.xml&#39;) #通过文件名解析xml
data &#61; open(&#39;test.xml&#39;)
dom2
&#61; parse(data) #通过解析已打开的xml文件

note
&#61; """

Peter
Jane
Reminder
Don&#39;t be late for the meeting

"""
dom3
&#61; parseString(note) #解析字符串

2.得到根元素

doc &#61; parse(&#39;test.xml&#39;) #通过文件名解析xml
root &#61; doc.documentElement

三.创建xml

 

from xml.dom.minidom import Document
doc
&#61; Document() #创建一篇空的文档from xml.dom.minidom import getDOMImplementation
impl
&#61; getDOMImplementation()
#创建doc&#xff0c;并且添加根节点book_store
doc &#61; impl.createDocument(None,"book_store",None)
print(doc.documentElement.tagName) #book_store#doc同doc&#61;Document()
doc2 &#61; impl.createDocument(None,None,None)

 

四.类及层次结构

 

可以发现&#xff1a;Element,Text,Comment,Attribute的创建工作全部由Document完成&#xff0c;然后通过appendChild或insertBefore方法将新的对象插入到Document中。

 

五.具体操作

1.解析xml文件

movies.xml

<collection shelf&#61;"New Arrivals">
<movie title&#61;"Enemy Behind"><type>War, Thrillertype><format>DVDformat><year>2003year><rating>PGrating><stars>10stars><description>Talk about a US-Japan wardescription>
movie>
<movie title&#61;"Transformers"><type>Anime, Science Fictiontype><format>DVDformat><year>1989year><rating>Rrating><stars>8stars><description>A schientific fictiondescription>
movie><movie title&#61;"Trigun"><type>Anime, Actiontype><format>DVDformat><episodes>4episodes><rating>PGrating><stars>10stars><description>Vash the Stampede!description>
movie>
<movie title&#61;"Ishtar"><type>Comedytype><format>VHSformat><rating>PGrating><stars>2stars><description>Viewable boredomdescription>
movie>
collection>

代码:

import xml.dom.minidom
from xml.dom.minidom import parse#使用minidom解析器打开xml文档
tree &#61; xml.dom.minidom.parse(&#39;movies.xml&#39;)
#print(type(tree)) #
collection &#61; tree.documentElement #获取文档根元素
if collection.hasAttribute(&#39;shelf&#39;):print("root element attribute:",collection.getAttribute("shelf"))
#print(collection.getAttribute(&#39;shelf&#39;)) #获取属性
movie_list &#61; collection.getElementsByTagName(&#39;movie&#39;)
movie_info_list
&#61; []
for movie in movie_list:print(&#39;******Movie*****&#39;)if movie.hasAttribute("title"):title &#61; movie.getAttribute(&#39;title&#39;)print(&#39;Title&#39;,title)type &#61; movie.getElementsByTagName(&#39;type&#39;)[0].childNodes[0].dataformat &#61; movie.getElementsByTagName(&#39;format&#39;)[0].childNodes[0].datarating &#61; movie.getElementsByTagName("rating")[0].firstChild.datastars &#61; movie.getElementsByTagName(&#39;stars&#39;)[0].firstChild.datadescription &#61; movie.getElementsByTagName("description")[0].firstChild.dataprint("type: ", type)print("format: ", format)print("rating: ", rating)print("stars: ", stars)print(&#39;description: &#39;, description)

2.写xml文件

效果:

xml version&#61;"1.0" encoding&#61;"utf-8"?>

<book_store name&#61;"amzon" website&#61;"https://www.amazon.cn/b?node&#61;1876097071"><book1><name>hamletname><author>William Shakespeareauthor>book1>
book_store>

代码:

from xml.dom.minidom import Document
doc
&#61; Document()

 comment &#61; doc.createComment(&#39;just a comment about book_store&#39;) #添加注释
  doc.appendChild(comment)

# from xml.dom.minidom import getDOMImplementation
#
impl &#61; getDOMImplementation()
#
doc &#61; impl.createDocument(None, None, None)

book_store
&#61; doc.createElement(&#39;book_store&#39;) # 创建根节点
book_store.setAttribute(&#39;name&#39;, &#39;amazon&#39;) #设置属性
book_store.setAttribute(&#39;website&#39;, &#39;https://www.amazon.cn/b?node&#61;1876097071&#39;)
doc.appendChild(book_store)
#添加节点
book1 &#61; doc.createElement(&#39;book1&#39;) #创建元素book1
book1_name &#61; doc.createElement(&#39;name&#39;)
book1_name_value
&#61; doc.createTextNode(&#39;hamlet&#39;) #创建text节点
book1_name.appendChild(book1_name_value)
book1_author
&#61; doc.createElement(&#39;author&#39;)
book1_author_value
&#61; doc.createTextNode(&#39;William Shakespeare&#39;)
book1_author.appendChild(book1_author_value)
book1.appendChild(book1_name)
book1.appendChild(book1_author)
book_store.appendChild(book1)
print(doc.toprettyxml(indent&#61;&#39;\t&#39;, newl&#61;&#39;\n&#39;, encoding&#61;&#39;utf-8&#39;).decode(&#39;utf-8&#39;))
# with open(&#39;book_store.xml&#39;,&#39;wb&#39;) as f: #写入的数据是bytes类型&#xff0c;所以wb方法写入
#
data &#61; doc.toprettyxml(indent&#61;&#39;\t&#39;, newl&#61;&#39;\n&#39;, encoding&#61;&#39;utf-8&#39;) #bytes类型数据
#
f.write(data)
with open(&#39;test_store.xml&#39;, &#39;w&#39;) as f:doc.writexml(f, indent&#61;&#39;\t&#39;, newl&#61;&#39;\n&#39;, encoding&#61;&#39;utf-8&#39;) #写入的是str类型数据,所以w方法写入

 3.简单封装

class MyXMLGenerator:def __init__(self,xml_name):self.xml_name &#61; xml_nameself.doc &#61; xml.dom.minidom.Document()def createComment(self,value):c &#61; self.doc.createComment(value)self.doc.appendChild(c)def setNodeAttribute(self,node,attname,value):node.setAttribute(attname,value)def createElement(self,tagName):ele &#61; self.doc.createElement(tagName)return eledef appendChild(self,node,parent_node&#61;None):if parent_node is not None:parent_node.appendChild(node)else:self.doc.appendChild(node)def setNodeValue(self,node,value):text_node &#61; self.doc.createTextNode(value)node.appendChild(text_node)def genXML(self):#print(self.doc.toprettyxml(indent&#61;&#39;\t&#39;,newl&#61;&#39;\n&#39;,encoding&#61;&#39;utf-8&#39;).decode(&#39;utf-8&#39;))with open(self.xml_name,&#39;wb&#39;) as f:data &#61; self.doc.toprettyxml(indent&#61;&#39;\t&#39;,newl&#61;&#39;\n&#39;,encoding&#61;&#39;utf-8&#39;) #python3中二进制数据f.write(data)

 参考:

https://docs.python.org/3/library/xml.dom.minidom.html

https://docs.python.org/3/library/xml.dom.html

转:https://www.cnblogs.com/hupeng1234/p/6684667.html



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
Carry_Jia
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有