有关XML的一些基本知识

XML概述

1. 什么是XML

1).什么是XML:全称:可扩展的标记语言。
2).它本质上就是一个“纯文本文件”,内部数据的格式:标签 + 数据
3).作用:
1).记录数据
student.xml
---------------------------------------------------

		<students>
			<student>
				<name>张三</name>
				<age>20</age>
				<sex></sex>
			</student>
			<student>
				<name>李四</name>
				<age>22</age>
				<sex></sex>
			</student>
		</students>

2).做配置文件
classes.xml
-----------------------------------------------------------

<classes>
	<class>
		 <className>com.itheima.demo03_获取Class对象的三种方式.Student</className>
		 <methodName>study</methodName>
	</class>
	<class>
		 <className>com.itheima.demo02_高并发问题一_可见性.MyThread</className>
		 <methodName>show</methodName>
	</class>
</classes>

XML语法

1. XML语法总述

1).总述:
1).XML内部是:标签 + 数据
2).“标签”由我们程序员自由定义。
2).一个XML文件,内部可包含的XML的语法元素:
1).文档声明
2).标签(元素)
3).属性
4).注释
5).转义字符
6).CDATA区

2. XML语法_文档声明

1).什么是文档声明:它是写在XML的第一行的位置:
<?xml version = “1.0 / 1.1” encoding = “编码” ?>
两个属性:
1).version :使用的xml版本,目前两个版本号可用:1.0(常用) / 1.1
2).encoding:此xml文档的编码。

2).作用:不用来存储数据。是给xml的编辑器、解析器看的,告诉xml的编辑器、解析器文档使用的什么版本的xml语法,此文件的编码。

3).注意:
1).一个XML文档中可以没有“文档声明”,所以“文档声明”不是必须的。
2).但如果要定义“文档声明”,必须定义在此XML文档的0行0列的位置。

3. XML语法_元素(标签)

1).XML文档内容:标签 + 数据
2).标签:由我们程序员自己定义,也有一定的规则;
3).标签名的定义规则:
1).可以包含:字母(中文)、数字、四个符号(_ - :(不建议) . )
2).不能以:数字、-符号、.符号 开头。
3).不能包含“空格”;
4).区分大小写;

4. XML语法_属性

1).任何标签都可以定义“属性”,属性也是用来记录数据的:
完整标签:

<student  id = “it001”>
				<name>张三</name>
			</student>

单标签:

<student id = “it001”  name = “张三”/>

2).属性必须要定义在“开始标签”中。
3).可以同时定义多个属性,格式:属性名1 = “值” 属性名2 = “值”
4).属性的“值”必须要用一对双引号,或者一对单引号括起来。

5. XML语法_注释

1).XML中只有一种注释:

2).例如:

<classes>
    <!-- 第一个类 -->
    <class>
        <stuname id = "it001"></stuname>
        <Stuname></Stuname>
    </class>
    <!-- 第二个类 -->
    <class>
        <className></className>
        <methodName></methodName>
    </class>
</classes>

3).注意:
1).注释不能出现在“文档声明”之前。
2).注释不能写在”标签名字”中。
3).注释不能嵌套:

<!-- 
	<!-- 注释 -->
-->
6. XML语法_转义字符

1).在XML中,一些符号被定义为一些“格式符号”,例如:<、>、”等等…
如果“数据”中需要包含这些符号,就需要使用“转义符号”;
2).常用的转义字符:
在这里插入图片描述

7. XML语法_CDATA区

1).如果我们的数据中包含了大量的转义字符:

<code>
	String str = &quot;jfTJFdksAFDljfKPOeljfeowfa&quot;;
	int count = 0;
	for(int i = 0; i &lt; str.length() ; i++){
		char c = str.charAt(i);
		if(c &gt;= &apos;a&apos; &amp;&amp; c &lt;= &apos;z&apos;){
			count++;
		}
	}
	System.out.println(&quot;count = &quot; + count);
</code>
	这样编写困难,可读性差。
	这时可以改用CDATA区

2).示例:

<code>
	<![CDATA[
		String str = “jfTJFdksAFDljfKPOeljfeowfa”;
		int count = 0;
		for(int i = 0; i < str.length() ; i++){
			char c = str.charAt(i);
			if(c >= ‘a’ && c <= ‘z’){
				count++;
			}
		}
		System.out.println(“count =+ count);
	]]>
</code>
8. XML约束的概念及作用

1).XML中的标签是由我们程序员任意定义的,但如果我们在设计项目时,就确定这个XML文件只存储某些方面的数据时,这时,XML的标签就不能随便写了。
例如:我们商定要使用student.xml记录学员信息

<students>
		<student>
		<name>张三</name>
			<sex></sex>
			<age>20</age>
		</student>
		<class>  <!-- 按业务来讲,不应出现 -->
		</class>
</students>

2).基于上面的原因,我们需要对我们的xml文档进行一些约束;
3).XML文档提供了两种约束:
A).DTD约束:比较简单,适合约束中小型、要求不是很严格的XML文档。
B).Schema约束:比较复杂,适合约束大型、对数据要求严格的XML文档。
4).这两种约束可以对xml约束:
1).文档中允许出现哪些标签。
2).约束允许出现的标签之间的顺序;
3).约束允许出现的标签的数量
4).约束标签之间的层次关系

5).两种约束方式:

1). DTD约束

1).编写DTD文档:
books.dtd(文件名)
--------------------------------------------------------

<!ELEMENT 书架 (+)>
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

2).编写XML
books.xml(文件名)
------------------------------------------------------

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "books.dtd">
<书架>
				<>
				<书名>
				 	Java开发指南
				</书名>
				<作者>黑马程序员</作者>
				<售价>88.88</售价>
						
</书架>	

2). Schema约束

1).创建一个Schema约束文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!--
传智播客DTD教学实例文档.将注释中的以下内容复制到要编写的xml的声明下面
复制内容如下:
<书架 xmlns="http://www.itcast.cn"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
  >
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="hehe"
           elementFormDefault="qualified">
    <xs:element name="书架">
        <xs:complexType><!--定义复合类型,当定义子元素的约束,属性约束-->
            <xs:sequence maxOccurs="unbounded"><!--可以控制子元素书的数量-->
                <xs:element name = "书">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name='书名' type='xs:string'/>
                            <xs:element name='作者' type='xs:string'/>
                            <xs:element name='售价' type='xs:double' />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

2).创建一个XML,引入这个Schema文档:

<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="hehe"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="hehe books.xsd"
        >
    <>
        <书名></书名>
        <作者></作者>
        <售价>88.88</售价>
    </>
</书架>

XML解析

1. 三种解析方式介绍

1).DOM解析:一次性将XML文档的所有内容全部读取到内存中,并在内存中创建XML的“文档对象模型”,这个对象中保留了XML文档的结构。
优点:在内存中保留了文档结构,可以增删元素。
缺点:由于一次性将全部文档读取到内存,比较占用资源。
2).SAX解析:逐行解析。一次只解析一行。
优点:由于一次只解析一行,所以“快”。
缺点:它内部没有文档结构,不能增删元素。
3).PULL解析:Android内置的XML解析方式,类似SAX。

2. 几种解析工具介绍

1). JAXP:sun公司提供支持DOM和SAX开发包
2). Dom4j:比较简单的的解析开发包(常用)【我们学习的】。它结合了DOM 和 SAX两种解析方式。
3). JDom:与Dom4j类似,但目前很少用。
4).Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便(项目中讲解)

3. XML解析原理及DOM模型

1).当使用dom4j解析XML文件时,最终会返回一个:DOM对象:document(文档对象)
在这个DOM对象中包含了这个文档中所有的“元素”信息。
在这里插入图片描述

4. DOM4J的使用步骤及常用方法

1).dom4j是一个第三方的工具包,所以使用时,要:
1).将所需jar包(dom4j-1.6.1.jar)复制到模块目录下;
2).将jar包添加到“IDEA的类库”;

2).编码使用了:

//1.创建一个SAXReader
SAXReader reader = new SAXReader();

//2.读取xml文件,并生成Document对象
Document dom = reader.read(new FileReader("books.xml"));

//3.解析
//3.1 获取根元素
Element root = dom.getRootElement();
System.out.println("标签名:" + root.getName());
.....

3).Element类的主要方法:
1).public String getName():获取当前元素的“ 标签名”;
2).public List elements():获取当前元素下所有的“子元素”;
3).public List elements(String eleName):获取当前元素下所有的”eleName”的子元素;
4).public String attributeValue(String attName):获取某个属性的值;
5).public String elementText(String subTagName):获取当前元素下subTagName子元素的值。

4).示例代码:
1).定义xml文件,在项目根目录下:

<书架>
    <书 id="b001">
        <书名>Java开发指南</书名>
        <作者>黑马程序员</作者>
        <售价>88.88</售价>

    </>
    <书 id = "b002">
        <书名>Oracle数据库开发</书名>
        <作者>黑马程序员</作者>
        <售价>100.00</售价>
    </>
    <书 id = "b003">
        <书名>MySQL从入门到精通</书名>
        <作者>黑马程序员</作者>
        <售价>77.77</售价>
    </>
    <>

    </>
</书架>

	2).测试类:
	public class Demo04 {
    public static void main(String[] args) throws Exception {
        //1.创建一个SAXReader
        SAXReader reader = new SAXReader();
        //2.读取xml文件,并生成Document对象
        Document dom = reader.read(new FileReader("books.xml"));

        //3.解析
        //3.1 获取根元素
        Element root = dom.getRootElement();
        System.out.println(root.getName());//书架

        //3.2 获取<书架>下的所有子元素
//     List<Element> elements = root.elements();
        List<Element> elements = root.elements("书");

        //3.3 遍历elements,获取每个<书>的所有内容
        for (Element ele : elements) {
            System.out.println("\t" + ele.getName());
            //1.获取id属性
            String id = ele.attributeValue("id");
            //2.获取子元素<书名>的值
            String title = ele.elementText("书名");
            //3.獲取子元素<作者>的值
            String author = ele.elementText("作者");
            //4.获取子元素<售价>的值
            String sale = ele.elementText("售价");
            System.out.println("\t\tid = " + id);
            System.out.println("\t\t书名:" + title);
            System.out.println("\t\t作者:" + author);
            System.out.println("\t\t售价:" + sale);
        }

    }
}
5. DOM4J结合Xpath解析XML

1).使用Xpath需要一个第三方jar包:jaxen-1.1-beta-6.jar ,添加到IDEA类库
2).Dom4j可以结合Xpath来解析XML文档:
3).dom4j对Xpath的支持的方法:
1).selectNodes(String path):选取多个节点
2).selectSingleNode(String path):选取一个节点。
4).Xpath的路径的写法:
参考帮助文档(XPathTutorial.chm)
示例代码:

public class Demo {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document dom = reader.read(new FileReader("books.xml"));

        Node node = dom.selectSingleNode("/书架");
        System.out.println(node);

        List list = dom.selectNodes("/书架/书/书名");
        System.out.println(list);

        List list1 = dom.selectNodes("//书名");
        System.out.println(list1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值