JavaWeb基础day01_XML

一、XML

XML文件的默认打开方式是浏览器

xml:是可扩展的标记语言 Extensible Markup Language。以一种标签语言与HTML类似

1、xml的作用

  1. 编写配置文件:C3P0编写XML配置文件
  2. 做数据传输

2、有效的XML文档

  1. 必须是格式良好的XML文档
  2. 使用DTD和XSD(XML Schema)定义语义约束

2.1、格式良好的XML

  • 声明信息,用于描述XML的版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
  • XML要有且仅有一个根元素。一个元素是一对标签,标签里面是内容
<books><!-- 根标签 -->
	<books_name 属性=“属性值”><!-- 子元素 -->
		<!-- 这里是写注释 -->
	</books_name>
</books>
  • XML是大小写敏感的
  • XML是标签成对的,而且要正确嵌套
  • 属性值要使用双引号。
  • 注释的写法
<!-- 这里写注释 -->

【案例1】:描述一下学生的信息

<?xml version="1.0" encoding="UTF-8"?>
<Students>
	<student id="1">
		<name>王彤</name>
		<course>Java</course>
		<score>89</score>
	</student>
	<student id="2">
		<name>李佳</name>
		<course>sql</course>
		<score>58</score>
	</student>
</Students>

二、DTD

1、DTD简介

DTD:文档类型定义 Document Type Definition

2、DTD作用

  • 约束XML文档格式,保证XML是一个有效的XML文档

3、DTD用法

DTD在使用的时候可以分为两种

  1. 内部DTD
  2. 外部DTD

3.1 内部DTD

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>
【元素声明语法】
<!ELEMENT 元素名(子元素[,子元素……])>

【数量词】 限制元素出现的次数

数量词含义
+表示出现一次或者多次
出现零次或一次
*出现零次或多次,即任意次
【属性声明语法】

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

【属性类型】:CDATA,表示字符数据(character data)

【默认值】

  • #REQUIRED:必须出现
  • #IMPLIED:不是必须的
<!ATTLIST student id CDATA "0">
<!ATTLIST student id CDATA #REQUIRED>
<!ATTLIST student id CDATA #IMPLIED>

【格式良好的DTD约束的XML文档】

【案例1】:描述一下学生的信息使用DTD约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD --> <!-- 中括号内写元素声明 -->
<!DOCTYPE scores [
 	<!ELEMENT scores (student*) >
	<!ELEMENT student (name, course, score)>
	<!ATTLIST student id CDATA #REQUIRED>
	
	<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
	<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
	<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->
]>
<scores>
	<student id="1">
		<name>王彤</name>
		<course>Java</course>
		<score>89</score>
	</student>
	<student id="2">
		<name>李佳</name>
		<course>sql</course>
		<score>58</score>
	</student>
	<student id="3">
		<name>张三</name>
		<course>html</course>
		<score>88</score>
	</student>
</scores>

3.2 外部DTD

创建一个独立的DTD文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student*) >
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>
	
<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->

在XML文件中引入DTD文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部DTD --> 
<!DOCTYPE scores SYSTEM "Student.dtd">
<scores>
	<student id="1">
		<name>王彤</name>
		<course>Java</course>
		<score>89</score>
	</student>
	<student id="2">
		<name>李佳</name>
		<course>sql</course>
		<score>58</score>
	</student>
</scores>

三、约束和验证XML

1、XSD

  • XSD
    • XML Schema是DTD的替代者
    • 不仅可以定义XML文档的结构, 还可以规范文档的内容
    • XSD本身也是XML文档,
    • XSD采用XML文档来定义语义约束,比DTD要复杂一-些,但是功能强大的多。
      • 支持丰富的数据类型
      • 允许开发者自定义数据类型
      • 可读性强
      • 可针对未来需求进行扩展

2、XML解析技术

对XML文件的操作,包括创建XML,对XML文件的增删改查操作

2.1常见的XML解析技术有哪些?

2.1.1 DOM解析

基于XML树结构,耗费资源。是官方提供的解析方式

2.1.2 SAX解析

是民间的解析方式,SAX是基于事件的解析方式,消耗的资源少。数据量大的时候适用

以上两种都是原生的解析方式,代码量巨大

2.1.3 JDOM解析

第三方提供的解析,开源,免费的解析方式,效率比DOM解析快

2.1.4 DOM4J接口**

第三方提供的解析,开源,免费的解析方式,是JDOM的升级版

2.2 使用DOM4J解析XML

解析XML入口是一个对象,是需要先拿到一个Document对象

2.2.1读取XML文档中的信息
  1. 导包:dom4j.jar
  2. 编写代码测试【如下】
public class Test {
	public static void main(String[] args) {
		//[1]创建SAX对象,用于读取XML文件
		SAXReader reader = new SAXReader();
		Document doc = null;
		try {
			// [2]读取xml文件,找到Document对象
			doc = reader.read(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"xml"+File.separator+"Student2.xml"));
			//[3]获取根元素 getRootElement
			Element root = doc.getRootElement();
			//System.out.println("根元素:"+root.getName());
            
			//[4 iterator]迭代器迭代更元素下的所有元素
			Iterator<Element> it = root.elementIterator();
			while (it.hasNext()) {
				Element element = (Element) it.next();
				//System.out.println(element.getName());
                
				//[5]取属性  Iterator attributes = element.attributeIterator(); 多个属性迭代继续
				Attribute id = element.attribute("id");
				//System.out.println(id.getName()+"="+id.getValue());
                
				//[6]获取子元素
				/*Iterator<Element> elements = element.elementIterator();
				while (elements.hasNext()) {
					Element element2 = (Element) elements.next();
					System.out.println(element2.getName());
				}*/
                //[7]打印输出
				System.out.println("id="+element.attribute("id").getName()+"-----"+"value="+element.attribute("id").getText());
				System.out.println("name="+element.element("name").getName()+"-----"+"value="+element.element("name").getText());
				System.out.println("score="+element.element("score").getName()+"-----"+"value="+element.element("score").getText());
				System.out.println("course="+element.element("course").getName()+"-----"+"value="+element.element("course").getText());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
2.2.2 使用dom4j生成XML文件
public class Test2 {
	public static void main(String[] args) {
		// [1] 通过Documenthelper创建一个documnet对象
		Document doc = DocumentHelper.createDocument();
		// [2] 写一个Xml文件,添加一个根元素,并得到根元素
		Element root = doc.addElement("books");
		// [3] 为根元素添加元素
		Element book = root.addElement("book");
		// [4] 为元素添加属性 方便链式编程
		book.addAttribute("id", "b01");
		// [5] 为book添加在元素
		Element name = book.addElement("name");
		Element author = book.addElement("author");
		Element price = book.addElement("price");
		// [6] 为子元素添加文本信息
		name.addText("Thinking in java");
		author.addText("efcod");
		price.addText("88");
		
		// [7] 将doc输出到XML文件中即可
		Writer writer = null;
		Writer writerFormat = null;
		try {
			writer  = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"book2.xml"));
			writerFormat  = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"bookFormat.xml"));
			doc.write(writer);
			// [8] 格式良好的输出
			OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter writer2 = new XMLWriter(writerFormat,format);
			writer2.write(doc);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if (writer!=null) {
					writer.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if (writerFormat!=null) {
					writerFormat.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@WAT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值