文档章节

XML语言介绍、XML约束、和解析XML语言的几种方式。

AAASSSSddd
 AAASSSSddd
发布于 2016/03/31 23:33
字数 1710
阅读 188
收藏 4

一、XML定义

1.1、XML介绍

Extensible Markup Language 可扩展的标记语言.XML技术是W3C组织发布的,目前推荐遵循的是W3C组织于2000年发布的XML1.0规范。在现实生活中大量存在有关系的数据。可以通过XML技术来描述这些关系数据。在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据:一个标签可分为开始标签和结束标签。在开始标签和结束标签之间又可以使用其它标签描述其它数据。

<中国>
	<北京>
		<海淀></海淀>
		<丰台></丰台>
	</北京>
	<杭州>
		<西湖></西湖>
		<滨江></滨江>
	</杭州>
</中国>

1.2、XML使用场景

  • 保存有关系的数据
  • 软件配置文件(描述程序之间的关系)

二、XML语法

2.1、XML语法组成

  • 文档声明
<!--standalone:是否是独立的文档。-->
<!--在xml中,空格和换行都作为原始内容被处理。-->
<!--不要出现中文全角空格。-->
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
  • 元素
<!--包含标签体-->
<a>内容</a>

<!--不包含标签体-->
<a/>

<!--嵌套标签,不允许交叉嵌套。-->
<a>
	<b>内容2</b>
</a>

<!--XML文档只能有一个根标签。-->
<soft>
	<c></c>
	<d></d>
</soft>

<!--对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。-->
<网址>
	www.163.com
</网址>
  • 属性
<!--XML属性的定义。-->
<demo name="text"></demo>

<!--也可以使用标签嵌套的方式来使用属性。-->
<demo>
	<name>text</name>
</demo>
  • 注释
<!-- 注释 -->
<!--XML声明之前不能有注释-->
<!--注释不能嵌套-->
  • CDATA区、特殊字符

 

  • 处理指令(processing instruction)

二、XML约束

1、要用一定的规范来约束XML语言,按照自定义规范来编写XML文档。

2、XML约束技术:XML DTD 和 XML Schema技术。

三、XML约束:(DTD约束)

1、DTD(Document Type Definition文档类型定义) book.dtd

<!--元素定义:ELEMENT
	书架 (书+):括号里放入元素名称
	书架  ANY:括号里放入元素类型ANY标识任何类型
	书 (书名,作者,售价):用逗号分割,表示内容的出现顺序必须与声明时一致
	书 (书名|作者|售价):用|分割,表示任选其一,即多个只能出现一个
	书+:一次或多次
	书?:0次或一次
	书*:0次或多次
	书:必须出现一次
 -->
 <!ELEMENT 书架 (书+)> <!-- 中间空格不可缺 -->
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)><!-- #PCDATA:字符串 -->
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

<!--为元素设置属性-->
<!--为标签配置属性定义
	通过 ATTLIST 元素设置属性
	属性名 
	属性值类型(CDTAT:字符串,ENUMERATED:枚举,ID,ENTITY:实体) 
	设置说明(#REQUIRED:必须的。#IMPLIED:可以设置也可以不设置。#FIXED:固定值)
	
	<!ATTLIST 元素名
	姓名 字符串 可选的
	年龄 CDATA 可选的
	联系信息 CDATA 必须的
	网站职务 CDATA 固定值 提供的固定值
	个人爱好 CDATA 直接使用默认值
>
-->

<!ATTLIST 作者
	姓名 CDATA #IMPLIED
	年龄 CDATA #IMPLIED
	联系信息 CDATA #REQUIRED
	网站职务 CDATA #FIXED "CTO"
	个人爱好 CDATA "ABC"
>

2、book.xml就可以按照dtd文件元素定义的约束规范来写了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "book.dtd">

<书架>
	<书>
		<书名>Spring攻略第二版</书名>
		<作者  联系信息="110">Gary Mak Josh Long</作者>
		<售价>100元</售价>
	</书>
	<书>
		<书名>JavaWeb开发</书名>
		<作者  联系信息="110">方立勋</作者>
		<售价>80元</售价>
	</书>
	
</书架>

 

四、XML解析和DOM、SAX解析原理(XML解析开发包:Jaxp(官方API),Jdom,dom4j(性能最好))

  1. DOM解析方式 

/**

* DOM解析方式(文档对象模型 W3C标准) :

* DOM解析会把整个文档放入直接放入内存里(以对象树的方式)

*     1.把每个节点变成Element对象

*     2.把每个属性变成Attribute对象

*     3.把每个文本变成Text对象

* 优点:对文档的增删改查比较容易。

* 缺点:如果文档比较大,内存就会溢出。

* 在DOM解析下,xml文档的每一个组成部分都会用对象来表示,如:标签名用Element,属性名用Attribute

* 但是不管什么对象,都是Node(节点对象)的子类,在开发中获取的任意节点都可以当做Node来使用。

*/

/**
	 * DOM解析:使用jaxp方式(性能最差)
	 * 获取某个节点下的文本值
	 * @throws Exception 
	 */
	@Test
	public void testJaxp1() throws Exception{
		//1.创建工厂
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.获取DOM对象树的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文档,获取代表文档的Document对象
		Document document = documentBuilder.parse("src/book.xml");
		//4.获取指定标签名的元素,返回一个集合
		NodeList nodeList = document.getElementsByTagName("书名");
		//5.获取nodeList下指定的元素
		Node node = nodeList.item(1);
		//6.获取元素下的文本值
		String content = node.getTextContent();
		//7.打印
		System.out.println(content);
		
	}
	
	/**
	 *DOM解析:使用jaxp方式(性能最差) 遍历所有的节点(递归)
	 * @throws Exception
	 */
	@Test
	public void testJaxp2() throws Exception{
		//1.创建工厂
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.获取DOM对象树的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文档,获取代表文档的Document对象
		Document document = documentBuilder.parse("src/book.xml");
		//4.获取根节点(根节点只有一个)
		NodeList nodeList = document.getElementsByTagName("书架");
		Node node = nodeList.item(0);
		
		list(node);
		
	}
	
	private void list(Node node) {
		
		if(node instanceof Element){
			System.out.println(node.getNodeName());
		}
		
		//1.得到当前根节点下的所有子节点
		NodeList nodeList = node.getChildNodes();
		//2.遍历所有的子节点
		for (int i = 0; i <nodeList.getLength(); i++) {
			//3.如果当前子节点还有子节点,获取子节点的子节点
			Node child = nodeList.item(i);
			//4.递归
			list( child );
		}
	}

	
	//得到标签下的某个属性值
	@Test
	public void testJaxp3() throws Exception{
		//1.创建工厂
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.获取DOM对象树的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文档,获取代表文档的Document对象
		Document document = documentBuilder.parse("src/book.xml");
		//4.获取指定标签名的元素,返回一个集合(在这里我们知道作者这个标签是Element元素才进行强转)
		Element element = (Element) document.getElementsByTagName("作者").item(0);
		//5.获取属性值
		String content = element.getAttribute("联系信息");
		//6.打印
		System.out.println(content);
		
	}
	//添加节点
	@Test
	public void testJaxp4() throws Exception{
		//1.创建工厂
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.获取DOM对象树的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文档,获取代表文档的Document对象
		Document document = documentBuilder.parse("src/book.xml");
		//4.创建标签
		Element priceElement = document.createElement("售价");
		//5.为标签体设置内容
		priceElement.setTextContent("59");
		//6.得到新创建的标签想要添加的位置
		Node book = document.getElementsByTagName("书").item(0);
		//7.添加新创建的标签
		book.appendChild(priceElement);
		//8.把更新后的内存中的document对象树重新写回xml文档里
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		Source xmlSource = new DOMSource(document);
		transformer.transform(xmlSource, new StreamResult(new FileOutputStream("src/book.xml")));

	}

 

© 著作权归作者所有

AAASSSSddd
粉丝 19
博文 51
码字总数 48587
作品 0
杭州
程序员
私信 提问
Java 处理 XML 的三种主流技术及介绍

XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体。本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介...

IBMdW
2012/08/14
7.8K
15
XML语法简单介绍

第一部分 XML相关的背景知识 XML的全称是Extesiable Markup Language,翻译为可扩展的标记性语言 跟JSON一样,是一种用于交互的数据格式 也叫XML文档(XML Document) 举例: <videos> <vide...

不孤独的美食家
2015/10/09
55
2
javaWeb 之 XML基础(二)

一、XML约束模式->纲要 ● 格式良好的(Well-formed)XML ● XML的约束模式 ● XML约束模式语言 ● 有效的(Valid)XML 1、格式良好的(Well-formed)XML ● 计算机程序在处理XML文档之前,首...

oYo字节
2014/03/10
92
0
四种常见的 POST 提交数据方式

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。 我们...

极客教程
2017/11/17
0
0
四种常见的 POST 提交数据方式

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。 我们...

lg2045
2014/08/29
235
0

没有更多内容

加载失败,请刷新页面

加载更多

经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0
实战项目-学成在线(八)

在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中心来管理微服务信息。 注册中心作用: 1、微服务数量众多,要进行远程调用就需要知...

lianbang_W
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部