XML系统学习
参考:W3School
XML基本概念
1.XML是eXtensible Markup Language,使用DTD(Document Type Definition)来描述数据,主要是为传输和存储数据,其焦点是数据的内容。
2.所有XML元素都必须正确地关闭,XML标签对大小写敏感,没有预定义的标签(eg:<h1>),XML文档必须有根标签,XML元素必须被正确地嵌套,XML 元素是可扩展。XML可保留空白字符,必须使用引号包围XML的属性值
3.XML 元素必须遵循以下命名规则:1)名称可以含字母、数字以及其他的字符名称;2)不能以数字或者标点符号开始;3)名称不能以字符 “xml”(或者 XML、Xml)开始;4)名称不能包含空格
4.XML注释 <!-- This is a comment -->
5. CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data),忽略这部分内容的正确语法是:<![CDATA[ Text to be ignored ]]>
6.在 XML 中有 5 个预定义的实体引用:
< < 小于
> > 大于
& & 和号
' ' 省略号
" " 引号
<message>if salary < 1000 then</message> 错误
<message>if salary < 1000 then</message> 正确
XML特点
1.命名空间:元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:xmlns:namespace-prefix="namespaceURI"
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
2.XML DOM:定义了所有 XML 元素的对象和属性,以及访问它们的方法(接口)
DOM特性:
整个文档是一个文档节点
每个 XML 标签是一个元素节点
包含在 XML 元素中的文本是文本节点
每一个 XML 属性是一个属性节点
注释属于注释节点
DOM属性:x表示一个节点对象
- x.nodeName - x 的名称
- x.nodeValue - x 的值
- x.parentNode - x 的父节点
- x.childNodes - x 的子节点
- x.attributes - x 的属性节点
DOM方法:x表示一个节点对象
- x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
- x.appendChild(node) - 向 x 插入子节点
- x.removeChild(node) - 从 x 删除子节点
Tips:DOM 处理中的普遍错误,认为元素节点包含文本。<year>2005</year>,元素节点 <year>,拥有一个值为 "2005" 的文本节点,"2005" 不是 <year> 元素的值!
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book> <book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book> <book category="Literature ">
<title >托斯卡纳艳阳下</title>
<author>弗朗西丝·梅耶斯</author>
<year>2006</year>
<price>29.8</price>
</book> </bookstore>
说明:根节点 <bookstore> 有四个 <book> 节点,每个 <book> 节点有四个子节点:<title>, <author>, <year> 以及 <price>,其中每个节点都包含一个文本节点,"Harry Potter", "J K. Rowling", "2005" 以及 "29.99"
创建XML文件
基于python语言,调用xml.dom模块创建xml的API
#coding=utf-8
import xml.dom.minidom #在内存中创建一个空的文档
doc = xml.dom.minidom.Document() #创建一个根节点bookstore对象,名为root
root = doc.createElement('bookstore') #设置根节点的属性
root.setAttribute('name', 'Sisyphe Bookstore')
root.setAttribute('address', '老街') #将根节点添加到文档对象中
doc.appendChild(root) bookList = [{'title' : 'Harry Potter','author' : 'J K. Rowling', 'year' : 2005,'price':29.99},
{'title' : 'Learning XML','author' : 'Erik T. Ray', 'year' : 2003,'price':39.95},
{'title' : '托斯卡纳艳阳下','author' : '弗朗西丝·梅耶斯', 'year' : 2006,'price':29.8}
] for i in bookList :
nodeBookstore = doc.createElement('bookstore') nodeTitle = doc.createElement('title')
nodeTitle.appendChild(doc.createTextNode(str(i['title']))) #给叶子节点name设置一个文本节点,用于显示文本内容 nodeAuthor = doc.createElement("author")
nodeAuthor.appendChild(doc.createTextNode(str(i["author"]))) nodeYear = doc.createElement("year")
nodeYear.appendChild(doc.createTextNode(str(i["year"]))) nodePrice = doc.createElement("price")
nodePrice.appendChild(doc.createTextNode(str(i["price"]))) #将各叶子节点添加到父节点bookstore中,
nodeBookstore.appendChild(nodeTitle)
nodeBookstore.appendChild(nodeAuthor)
nodeBookstore.appendChild(nodeYear)
nodeBookstore.appendChild(nodePrice) root.appendChild(nodeBookstore) #最后将bookstore添加到根节点root中 #开始写xml文档
fp = open('C:\Users\HP\Desktop\BookStore.xml', 'w')
doc.writexml(fp, indent='\t', addindent='\t', newl='\n', encoding="utf-8")
解析源码:
1.minidom.Document() 创建一个空白xml文档树对象。每个xml文档都是一个Document对象,代表着内存中的DOM树
2.doc. createElement(tagName) 创建xml文档节点,参数表示要生成节点的名称
3.node.setAttribute(attname, value) 给节点添加属性值对(Attribute)
4.doc.createTextNode(data) 给叶子节点添加文本节点
5.node.appendChild(nodeName) 将某个节点添加到节点node下
6.writexml(writer, indent, addindent, newl, encoding) 将内存中xml文档树写入文件中
writer是文件对象
indent是每个tag前填充的字符,如:’ ‘,则表示每个tag前有两个空格
addindent是每个子结点的缩近字符
newl是每个tag后填充的字符,如:’\n’,则表示每个tag后面有一个回车
encoding是生成的XML信息头中的encoding属性值,在输出时minidom并不真正进行编码的处理,如果你保存的文本内容中有汉字,则需要自已进行编码转换。
writexml方法是除了writer参数必须要有外,其余可以省略。
输出结果:
没有编码问题,给自己一个蜜汁微笑
乏善可陈的下午,Happy Ending!
XML系统学习的更多相关文章
- 零基础如何系统学习Java Web
零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...
- Android] Android XML解析学习——方式比较
[Android] Android XML解析学习——方式比较 (ZT) 分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...
- Hibernate的系统 学习
Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...
- Dubbo -- 系统学习 笔记 -- 快速启动
Dubbo -- 系统学习 笔记 -- 目录 快速启动 服务提供者 服务消费者 快速启动 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubb ...
- Dubbo -- 系统学习 笔记 -- 配置
Dubbo -- 系统学习 笔记 -- 目录 配置 Xml配置 属性配置 注解配置 API配置 配置 Xml配置 配置项说明 :详细配置项,请参见:配置参考手册 API使用说明 : 如果不想使用Spr ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 多注册中心
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 多注册中心 可以自行扩展注册中心,参见:注册中心扩展 (1) 多注册中心注册 比如 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 多协议
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 多协议 可以自行扩展协议,参见:协议扩展 (1) 不同服务不同协议 比如:不同服务 ...
- Dubbo -- 系统学习 笔记 -- 配置参考手册
Dubbo -- 系统学习 笔记 -- 目录 配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> ...
- Dubbo -- 系统学习 笔记 -- 入门
Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...
随机推荐
- hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交
题面 题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为‘#’,每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交 ...
- 前后端分离开发,基于SpringMVC符合Restful API风格Maven项目实战(附完整Demo)!
摘要: 本人在前辈<从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)>一文的基础上,实现了一个基于Spring的符合REST风格的完整Demo,具有MVC分层结构并 ...
- AtCoder Regular Contest 069
1. C - Scc Puzzle 计算scc的个数,先判断s个数需要多少个cc,多的cc,每四个可以组成一个scc.注意数据范围,使用long long. #include<bits/stdc ...
- Centos 6 搭建邮箱服务器教程
Centos 6 搭建邮箱服务器主要是是包括了Postfix, Dovecot和 MySQL了,下文我们详细的为各位介绍Centos 6 搭建邮箱服务器教程(Postfix, Dovecot和 MyS ...
- 第5章分布式系统模式 在 .NET 中使用 DataSet 实现 Data Transfer Object
要在 .NET Framework 中实现分布式应用程序.客户端应用程序需要显示一个窗体,该窗体要求对 ASP.NET Web Service 进行多个调用以满足单个用户请求.基于性能方面的考虑,我们 ...
- 关于电脑安装新硬盘,出现无法是识别设备,03F0问题解答。
问题说明:在添加新的硬盘,切确定硬盘没有坏的情况下,无法识别出新的硬盘. 解决方案: 1.检查bios系统里的安全模式,是否处于开启中.因为在windows 8.1以上的版本中,不开启的情况下只能读取 ...
- VHDL_LIB之DFF
1 D-Flip-Flop with async reset or set library IEEE; use ieee.std_logic_1164.all; entity FFD is gener ...
- java线程入门知识
为什么需要多线程? . 模型的简化,如某些程序是由多个相对独立任务的运行: . 图形界面的出现,输入.输出的阻塞 . 多核CPU的更好利用 . 异步行为的需要 Java多线程的特性: . 程序的入口m ...
- associatedtype关联类型
associatedtype关联类型 定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用.关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协 ...
- 什么是J2EE的集群?
1. 前言 现在有越来越多的关键应用和大型应用是基于J2EE 来创建的,像银行系统和帐单系统这些关键应用要求有很高的可用性,而Google 和Yahoo 这样的大型应用就需要很好的可扩 ...