`
天使的左手
  • 浏览: 55599 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

xml学习

    博客分类:
  • java
xml 
阅读更多
XML:Extensible Markup Language 用标记来修饰文本信息 标签没有预定义,可以自定义
数据相关的技术,企业开发中常用来存储数据和传输数据(而非显示数据),或者作为框架的配置文件,且与任何编程语言无关。
应用:1.充当数据库,保存数据信息 2.AJAX,WebService,网络中传输数据,可以使用xml格式
使用xml描述复杂的关系模型数据

XML语法:
1.文档声明 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
encoding属性用于指定文档中的字符编码,如果没有指定该属性,默认采用ISO-8859-1(不支持中文数据)
如果encoding编码和文件本身的编码不一致,在IE无法解析该xml中的字符,会报错。

standalone属性表示该文档是否依赖外部文件

2.元素
每个元素标签都必须结束,元素标签不能交叉嵌套,有且仅有一个根标签(格式良好的xml文档规范)

xml文档中的空格和换行都会被xml解析器解析处理的

3.属性
写在元素上,属性值用双引号或者单引号包含起来

4.注释 <!-- ... --> 存在于正文,不能在文档声明和处理指令之前

5.<![CDATA[...]]> 不会被xml解析器处理
转义字符 < less than &lt; > greater than &gt; <a> &lt;a&gt; 
特殊字符必须进行转义,CDATA节和转义字符都能实现原样输出,优先选择CDATA

6.处理指令 processing instruction
控制xml文档如何被解析引擎所解析的。控制xml数据的显示样式
 <?xml-stylesheet type="text/css" href="css.css"?>
XSLT可以实现对xml的显示控制


xml应用
1.存储和数据传输 为了方便,不使用xml约束技术
	所有xml的生成和解析都是通过程序完成
2.配置文件,为了保证元素的准确性,使用约束技术

---------------------------------------------------------------------------
为什么使用xml约束?
使用xml约束,可以使元素内容更加规范。如果企业开发中没有使用约束,是因为使生成和解析xml的过程更加简单

DTD Document Type Definition
语法 <!ELEMENT element name>  每个元素对应一个element

xml文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "books.dtd">
<books>
	<book>	
		<name>java编程思想</name>
		<price>108</price>
	</book>
</books>

dtd约束文档
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT books (book)>
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>

DTD约束可以作为一个单独的文件编写,也可以在xml文档内部编写
DTD与xml文档关联的三种方式
1.内部DTD
<!DOCTYPE 根元素 [..]>

<!DOCTYPE books [
	<!ELEMENT books (book)>
	<!ELEMENT book (name, price)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT price (#PCDATA)> 
]>

2.外部DTD(引用本地dtd) <!DOCTYPE 根元素 SYSTEM "本地文件地址">
3.公共DTD(引用网络上的dtd) <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

公共DTD名称 W3C官方组织规定的

元素ELEMENT定义
<!ELEMENT 元素名 (子元素或者元素类型)>

()表示子元素或者分组
,表示元素的顺序
+ * ?表示元素出现的次数,类似正则表达式
|表示多个选一个

元素类型:
#PCDATA,EMPTY,ANY,其他类型

属性ATTLIST定义
<!ATTLIST 元素名
		  属性列表(多个)>
属性列表定义
属性名 类型 约束

常用的三个类型
CDATA 文本类型属性
ID 表示属性值唯一 
(1|2|3)多选一

约束
#REQUIRED 属性必须
#IMPLIED 属性可选
#FIXED 属性值固定
Default 默认值

实体ENTITY定义(对于重复的xml数据内容,可以抽取为实体)
<!ENTITY 实体名称 "实体值">
引用实体 &实体名称;

---------------------------------------------------------------------------
XML Schema(模式文档)
包含一套预定义的元素和属性(这套元素和属性规定了schema文档的结构和内容),
可以根据这些预定义的元素和属性来编写自己的schema文档,最终用这个schema文档来完成对xml实例的约束

Schema文档本身是XML文档 DTD使用单独的语法

编写了一个XML Schema约束文档后,通常需要把这个文档中定义的元素和属性绑定到一个唯一的URI地址(名称空间)上,
XML实例文档通过这个URI告诉解析引擎,文档中包含的元素来自哪里,被谁约束

为什么需要引入名称空间?
一个xml实例可以包含多个schema文档,当多个schema中定义了同名元素,为了区分哪个元素来自哪个schema文档,就有了名称空间的概念

编写一个schma文档的步骤
1. 引入预定义的schema元素和属性的名称空间 
xmlns="http://www.w3.org/2001/XMLSchema" 
2. 在schema文档中定义自己的元素和属性,最后将这些元素和属性绑定到一个名称空间上,以供xml实例文档引用
targetNamespace="http://www.example.org/books"
3. 在xml实例文档中引入自定义的schema文档
xmlns="http://www.example.org/books"
4. 声明xml实例文档使用了schema文档约束
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. 指定引入的自定义schema文档的位置
xsi:schemaLocation="http://www.example.org/books books.xsd"> (格式:名称空间 schema文档位置)

books.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
		targetNamespace="http://www.example.org/books" 
		elementFormDefault="qualified">
	
	<!-- 每个元素对应一个element -->
	<element name="books">
		<!-- 包含子元素或者属性的元素 表示一个复杂元素 -->
		<complexType>
			<!-- sequence强调子元素的顺序 -->
			<sequence>
				<element name="book">
					<complexType>
						<sequence>
							<!-- 简单元素的类型直接通过type属性指定 -->
							<element name="name" type="string"/>
							<element name="price" type="double"/>
						</sequence>
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>

books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/books"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.example.org/books books.xsd">
	<book>
		<name>Core Java</name>
		<price>222</price>
	</book>
</books>

http://www.intertech.com/Blog/xml-schema-elementformdefault-and-attributeformdefault/

elementFormDefault="qualified"(默认值,建议使用)
表示xml实例中的全局元素(schema文档中schema节点的直接节点)和局部元素(非schema节点的直接节点)都必须使用前缀
elementFormDefault="unqualified"(需要给每个引入的名称空间加一个前缀,否则,如果将引入的名称空间作为xml实例文档的默认名称空间,
使用schema文档中定义的局部元素会报错 -- 元素前没有加任何名称空间,表示属于被默认名称空间限定,这与elementFormDefault="unqualified"不符)
表示xml实例中的全局元素使用前缀,局部元素不使用前缀
attributeFormDefault="qualified"(需要给每个引入的名称空间加一个前缀,否则,如果将引入的名称空间作为xml实例文档的默认名称空间,
使用schema文档中定义的属性会报错 -- 属性前没有加任何名称空间,表示属于被不包含任何前缀,这与attributeFormDefault="qualified"不符)
表示xml实例中所有属性必须使用前缀
attributeFormDefault="unqualified"(默认值,建议使用)
表示xml实例中所有属性都不使用前缀

------------------------------------------------------
XML解析:DOM和SAX

DOM:Document Object Model(文档对象模型)
思想:将整个XML文档加载到内存中(所有的元素、属性、文本、注释、CDATA、XML文档都会被解析成一个Node对象),形成一个文档对象(树形结构),
所有对XML的操作都基于这个内存中的文档对象
W3C组织推荐的标准 -- 所有开发语言都支持

SAX:Simple API for XML (XML简单API)
非推荐标准,来自XML社区
思想:不需要将整个XML文档加载到内存中,边解析,边处理,处理完成后释放相应的内存资源

STAX:The Stream API for XML(XML流式API)从JDK1.6新加入的
STAX是一种拉模式的XML处理方式,而SAX是一种推模式的XML处理方式

推模式(push):由服务器为主导,主动向客户端发送数据
拉模式(pull): 由客户端为主导,主导向服务器申请数据

XML解析方式:解析XML的思想
XML解析开发包:解析XML思想的具体实现

常用的XML解析开发包:
JAXP(Java API for XML Processing)SUN公司实现的XML解析包,支持DOM、SAX、STAX
DOM4j 来自开源社区的XML解析的开源框架,支持DOM
XML PULL Java开源框架中的一种XML解析实现(Android内置了pull解析器),支持STAX

当SAX或STAX解析XML文档时,如果读到内存的数据不被释放,那么内存中将包含整个XML文档的数据(类型DOM 支持修改和回写)

javaee开发中,优先选择DOM方式(编程简单)解析XML,如果XML文档非常大,优先考虑使用STAX方式解析XML
移动开发中优先使用STAX方式解析XML文档


javax.xml.parsers:dom、sax解析相关的解析器和工厂类
javax.xml.stream:stax解析相关的类
org.w3c.dom:dom解析相关的类(数据节点类)
org.xml.sax:sax解析相关的类

----------------------------------------------------------
DOM解析
1、产生dom解析器工厂 
2、通过dom解析器工厂生成dom解析器
3、通过dom解析器解析xml文档,返回代表整个xml文档的document对象
4、通过document对象完成对xml文档的各种操作

Node接口:当xml文档加载到内存后,所有的数据都是一个节点(元素节点Element,属性节点Attr,文本节点Text,注释节点,CDATA节点,文档节点Document...)
所有的这些节点都是node接口的子接口

Node接口的三个通用方法:
getNodeName():返回节点的名称
getNodeType():返回节点的类型
getNodeValue():返回节点的值  ---- 所有元素节点value都是 null

<name>xxx</name>
获得name元素内容xxx的两种方法
1、node.getFirstChild().getNodeValue() 先获取name元素的第一个子节点getFirstChild(),然后获取节点的内容getNodeValue()
2、node.getTextContent() 直接获取name元素的文本节点的内容

关于节点查找,常用的几个方法
node.getChildNodes() 获得当前节点下面所有子节点
node.getFirstChild() 获得当前节点的第一个子节点
node.getLastChild() 获得当前节点的最后一个子节点
node.getParentNode() 获得当前节点的父节点
node.getPreviousSibling() 获得当前节点的前一个兄弟节点
node.getNextSibling() 获得当前节点的下一个兄弟节点

book元素包含多少个子节点?(5个,三个文本节点,两个元素节点)
<book id="b0001">
	<name>java编程思想</name>
	<price>119</price>
</book>

document.getElementById() 只有在使用了约束的xml文档中,才起作用
一般情况都使用document.getElementsByTagName()
所有开发语言中都默认支持DTD,如果需要使用schema,需要单独编程导入schema

<!DOCTYPE books [
	<!ELEMENT books (book+)>
	<!ELEMENT book (name, price)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT price (#PCDATA)>
	<!ATTLIST book
		id ID #REQUIRED>
]>
<books>
	<book id="b0001">
		<name>java编程思想</name>
		<price>119</price>
	</book>

	<book id="b0002">
		<name>java分布式计算</name>
		<price>85</price>
	</book>
</books>

document.getDocumentElement() 获得文档根节点
document.createElement 创建一个新的节点
node.appendChild() 在node节点的最后追加一个子节点
parentNode.removeChild(node) 删除node节点

删除节点:
NodeList nodeList = doc.getElementsByTagName("name");
for (int i = 0; i < nodeList.getLength(); i++) {
	System.out.println(nodeList.getLength());
	Element name = (Element) nodeList.item(i);
	if (name.getTextContent().contains("java")) {
		Node book = name.getParentNode();
		book.getParentNode().removeChild(book);
		i--; //删除节点后,总的节点数减1,i减1
	}
}

---------------------------------------------
SAX解析 (基于事件驱动)
原理:将待解析的xml文档和事件处理器传递给sax解析器,sax解析器逐行处理xml文档,扫描到文档开始、结束,元素开始、结束,文本内容等地方时会回调
事件处理器中的事件方法,直至解析完整个xml文档

五个常用的事件处理方法:
startDocument()  文档开始事件
startElemen() 元素开始事件
characters() 文本元素事件
endElement() 元素结束事件
endDocument() 文档结束事件

为什么说SAX是推模式解析? 解析器控制xml文档解析,由解析器调用相应事件方法

在startElemen() endElement() 获得开始和结束元素名称
在characters() 获得读取到文本内容
在startElemen() 读取属性值 

--------------------------------------------
PULL解析(使用STAX方式解析,拉模式)
原理:将xml文档传递给解析器,在客户端手动通过next()获取当前事件(类型),执行相应的事件处理

STAX解析方式比SAX高校?
1、SAX处理所有的事件类型,STAX由客户端控制要处理的事件类型
2、STAX可以随时终止解析过程
分享到:
评论

相关推荐

    XML学习手册第二版

    在“XML学习手册第二版”中,它深入浅出地介绍了XML的基本概念、语法规范以及实际应用。 首先,XML的核心是其结构化特性。XML文档由元素构成,元素是XML文档的基本构建块,它们可以包含其他元素、文本或者属性。每...

    xml学习指南 xml教程

    XML(eXtensible Markup Language)是一种用于标记数据的语言,其设计目的是传输和存储数据,而非显示数据。在本文中,我们将深入探讨...通过实践和阅读“XML学习指南”,你可以深入掌握这一重要技术,提升你的IT技能。

    XML学习资料合集之一

    ASP.NET_XML深入编程技术.pdf ...XML学习指南 XML官方指南中文版(CHM) XML实用大全.chm XML指南.chm XML编程从入门到精通.pdf XML网页制作实作教程 xml解决方案开发实务.pdf XML高级编程 无废话XMLl(PDF)

    XML学习资料合集之二

    ASP.NET_XML深入编程技术.pdf ...XML学习指南 XML官方指南中文版(CHM) XML实用大全.chm XML指南.chm XML编程从入门到精通.pdf XML网页制作实作教程 xml解决方案开发实务.pdf XML高级编程 无废话XMLl(PDF)

    XML学习大全(适合开发人员)

    《XML学习笔记.doc》可能包含了个人或团队在学习过程中整理的要点、难点解析、实战经验,以及一些易错点和最佳实践,这些都是理论知识之外的宝贵经验。 总的来说,这个“XML学习大全”资料包全面覆盖了XML的基础到...

    TinyXML学习资料

    在学习TinyXML的过程中,阅读提供的“TinyXML学习资料.pdf”文件会非常有帮助。这份资料可能涵盖了TinyXML的基本概念、用法示例以及常见问题的解决方案。通过深入学习,你将能够熟练地利用TinyXML进行XML的解析和...

    XML学习资料大全

    这个“XML学习资料大全”包含了丰富的资源,可以帮助你深入理解和掌握XML的核心概念与实际应用。 1. **XML的特征及应用场合**: XML的设计目标是使数据具有自我描述性,它使用标签来定义数据结构,而非呈现方式。...

    XML学习指南(经典)

    《XML学习指南》作为一款经典教程,将帮助我们深入了解这一强大的工具。 首先,XML的基础知识包括其基本结构和语法。XML文档由元素(Element)、属性(Attribute)、文本(Text)等构成,遵循严格的规则,如元素...

    XML学习指南 电子书

    本书及附带的光盘还提供了一个完整的XML学习软件包。这个软件包提供了学习创建和显示XML文档所需基础知识的所有信息、指导和软件。本书还包括了指向Web上大量XML信息的详尽链接集,如果你想要了解基础知识以外的信息...

    XML学习指南(PDF格式)

    在《XML学习指南》中,你将深入了解到XML的基础和高级概念。 1. **XML基础**:XML的语法基础包括元素、属性、文本内容、注释和处理指令。每个XML文档都由一系列元素构成,元素是XML文档的最基本单位,通过尖括号...

    XML学习指南中文版(PDF)

    在本“XML学习指南中文版”中,你将深入理解XML的基础概念、结构以及它在信息技术领域的广泛应用。 XML的核心在于其可扩展性,这意味着用户可以自定义标签来表示数据,而不仅仅是预设的HTML标签。这种灵活性使得XML...

    XML学习心得分享XML学习心得分享

    XML学习心得分享 XML(Extensible Markup Language)是一种用于建立描述结构化数据标示语言的语言。它具有开放、可读取、扩展性强、避免浏览器或其他中介软件自行增加特定的HTML标签等特点。XML用于描述结构化数据...

    xml学习手册 xml学习资料

    在XML学习手册中,可能会详细介绍XML的声明(Document Type Declaration, DTD)和XML Schema,它们是用于定义XML文档结构的规范。DTD允许定义元素和属性的类型,以及元素间的约束关系;XML Schema则更现代,提供了更...

    XML 学习指南中文版(PDF)

    XML学习指南,极适合新手学习,其中样式表、处理指令和CDATA、DTD子集、级联样式表、XSL模版等XML基本知识都有详细介绍及教学,本书将有助你开发ASP.NET+XML网络程序时遇到的XML方方面面的问题

    xml学习代码

    本代码库是针对"Java Web开发详解"一书的配套XML学习代码,旨在帮助读者更好地理解和实践XML的相关概念。 1. **XML基础** - **XML元素**: XML文档的核心是元素,它们用尖括号 `和 `&gt;` 包围,如 `&lt;element&gt;content...

    XML学习进阶 XML学习入门资料

    XML(eXtensible Markup ...通过深入学习XML,你可以掌握数据表示的灵活性,更好地进行数据交换和程序设计。这个资料包“XML初学进阶”可能包含基础教程、实战案例和相关工具的使用指南,是你提升XML技能的好助手。

    XML学习指南!!!!!!!!!!!!!!!!!!!!!!!!!!!

    本书及附带的光盘还提供了一个完整的XML学习软件包。这个软件包提供了学习创建和显示XML文档所需基础知识的所有信息、指导和软件。本书还包括了指向Web上大量XML信息的详尽链接集,如果你想要了解基础知识以外的信息...

    XML学习教程 XML标准

    XML学习进阶1-- 什么是XML 1 1 为什么使用 XML? 3 2 什么是 XML? 3 3 数据的结构表示 4 4 XML 文档 4 5 数据是从表示和处理中分离出来的 7 6 使XML数据自描述 8 7 XML数据处理 9 8 开放式标准 10 9 从XML中受益 11...

    xml学习指南

    在XML学习过程中,你需要理解XML文档的语法规范,例如每个元素必须有开始标签和结束标签,元素名称是大小写敏感的,且需要正确嵌套。此外,XML文档需要有根元素,所有的其他元素都是根元素的子元素。 XML文档可以与...

    xml学习资料,很全的xml学习资料

    很全的xml学习资料 很全的xml学习资料 很全的xml学习资料

Global site tag (gtag.js) - Google Analytics