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

1、XML定义

1.一、XML介绍

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

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

1.二、XML使用场景

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

2、XML语法

2.一、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)

2、XML约束

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

二、XML约束技术:XML DTD 和 XML Schema技术。dom

3、XML约束:(DTD约束)

一、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"
>

二、book.xml就能够按照dtd文件元素定义的约束规范来写了。网站

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

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

 

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

  1. DOM解析方式 ui

/**spa

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

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

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

*     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")));

	}
相关文章
相关标签/搜索