JavaWeb学习的第九天(可扩展标记语言XML_语法_约束_解析)

一、JS创建对象的两种方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*JS去创建对象的原型方式*/
        var student=new Object();
        student.id=1;
        student.name="张三";
        student.age=20;
        console.log(student)
        /*JS通过JSON方式创建Js对象第二种方式*/
        var student1={id:1,name:"张三",age:20};
        var student2={id:2,name:"李四",age:21};
        var student3={id:3,name:"王五",age:22};
        var arr=["a","b","c"];
        var arr=[{id:1,name:"张三",age:20},{id:2,name:"李四",age:21},{id:3,name:"王五",age:22}];
        console.log(arr)
        /*JSON本身是JS创建对象的一种方式,本质是JS里面的对象表示法*/
    </script>
</head>
<body>
</body>
</html>

运行结果截图

二、XML概述

1.什么是XML

HTML:网页中展示数据,HTML语法松散,
XML(扩展标记语言),一开始出现是为了替换HTML,语法非常严格
XML被设计用来传输和存储数据
在网络中传输数据用两种方式json和xml,但是现在一般的传输数据是用JSON
XML一般用于存储数据,主要用于配置文件
XML的可用标签是固定的,元素数量不是固定的

2.XML的基本语法

1.1 xml文档的后缀名 .xml
1.2 xml第一行必须定义为文档声明
1.3 xml文档中有且仅有一个根标签
1.4 属性值必须使用引号(单双都可)引起来
1.5 标签必须正确关闭
1.6 xml标签名称区分大小写
注意:满足语法规则的xml文档,我们称之为格式良好的xml

3.XML的文档声明

3.1 文档声明:通常出现在XML的第一行第一列的位置!!!
3.2 写法:<?xml 属性名=”属性值” 属性名=”属性值” ...?>
	version:必须的.使用”1.0”
	encoding:字符集.是使用浏览器打开的时候采用的默认的字符集的编码.
	standalone:描述XML文档是否需要依赖其他的文件.
3.3 xml中导入外部样式表:<?xml-stylesheet type="text/css" href="test.css" ?>

4.XML的注释

<!-- XML的注释 -->

5.XML的元素

4.1 名称可以包含字母、数字以及其它的字符
4.2 名称不能以数字或者标点符号开始
4.3 名称不能以字符“xml”(或者XML、Xml) 开始
4.4 名称不能包含空格

6.XML的属性

6.1 属性的名称规范与元素一致.
6.2 必须用引号引起来

7.XML的特殊字符和CDATA区

&lt;  |  <  |  小于 
&gt;  |  >  |  大于 
&amp; |  &  |  和号 
&apos;|  '  |  单引号 
&quot;|  "  |  引号 
假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:
<message>if salary < 1000 then</message>
为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:
<message>if salary &lt;1000 then</message>

XML的CDATA区:(CDATA:Character Data) <![CDATA[  内容  ]]>
<script>
	<![CDATA[function matchwo(a,b){if (a < b && a < 0){return 1}else{return 0}}]]>
</script>
在上面的例子中,在 CDATA 区段中的所有东西都会被解析器忽略。

三、XML的约束

1.为什么会有XML的约束

<!--XML作为配置文件给框架提供载体,XML文档中的标签应该是固定的-->
<!--如何规定在一个XML中只能写某一些东西,不能写另外的一些东西??-->
<!--提供了一种机制-XML约束(会用)-->

2.什么是XML的约束

就是用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数.
XML的约束:用来规范XML的写法.

3.Xml约束有两种分类

1. DTD(简单约束) 
2. Schema约束(比DTD更加复杂,约束的更加细致)

4.DTD引入的两种方式

DTD的引入方式:
	内部的DTD:<!DOCTYPE persons [要写的约束]>
	外部的DTD:
		一种本地DTD:<!DOCTYPE persons SYSTEM "mybatis.dtd">
		一种网络DTD:<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

实例说明

<?xml version="1.0" encoding="UTF-8" ?>
<!--文档内部引入-->
<!DOCTYPE student [
        <!ELEMENT student (to,from,heading,body)>
        <!ELEMENT to      (#PCDATA)>
        <!ELEMENT from    (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body    (#PCDATA)>
        ]>
<student>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</student>
<?xml version="1.0" encoding="UTF-8" ?>
<!--外部引入本地DTD文档-->
	<!DOCTYPE student SYSTEM "student01.dtd">
	<!--system:本地的,public:网络上的-->
	<student>
	    <to></to>
	    <from></from>
	    <heading></heading>
	    <body></body>
	</student>
<!--外部引入网络DTD文档-->
	<!DOCTYPE configuration 
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd">

5.Schema引入的方式

<?xml version="1.0" encoding="UTF-8" ?>
<beans  xmlns="http://www.springframework.org/schema/bianyiit/spring"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/bianyiit/spring
        spring_beans1.xsd">
    <bean></bean>
</beans>

实例说明

<!--spring.xml-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--引约束文件-->
<beans  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:tt="http://www.springframework.org/schema/bianyiit/spring"
        xsi:schemaLocation="
        http://www.springframework.org/schema/bianyiit/spring spring_beans1.xsd
        http://www.springframework.org/schema/beans spring_beans.xsd">
    <tt:bean></tt:bean>
</beans>
<!--在根标签beans上去引外部配置文件-->
<!--namespace:名称空间,文档的全限定类名,唯一可以指向文档的名称
在xsd约束中会定义一个全限定类名:targetNamespace="http://www.springframework.org/schema/beans"-->
<!--schemaLocation位置:指定上面的名称空间的位置-->

spring_beans.xsd(注意Schema约束文档的后缀名为xsd)

spring_beans1.xsd

注意:上述图片只是XML约束文档的部分截图

四、XML的解析

2.XML提供了两种解析方式--DOM解析和SAX解析
3.DOM解析方式的原理

3.1	DOM解析方式的原理,先一次性将xml文档加载到内存,形成一颗DOM树
3.2 document对象代表着整个文档,xml只有一个根节点root,根节点下面会有很多子节点
3.3 XMLDOM树的结构如下所示
	<root>
	  <child>
	    <subchild>.....</subchild>
	  </child>
	</root>
3.4 通过document对象获取整个xml的文档,再通过分别document对象调用方法分别获取各个标签,属性以及文本的内容

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>

4.SAX解析方式的原理

1. 没解析到根标签之前,读出第一行<?xml version="1.0" encoding="UTF-8" ?>发出一个解析开始文档的事件,
2. 当读到根标签的时候,发出一个解析开始标签的事件student,
3. 又会向下解析另外一个开始标签的事件student,
4. 然后发出一个解析标签name的事件,
5. 下一次发出一个解析文本name里面的张三的标签,
6. 当解析到</student>的结束标签,
7. 最后到一个结束文档的标签

SAX解析图解如下

5.两种解析方式之间的区别(面试题)

DOM解析的特点:
	1.需要一次性将文档加载至内存,形成DOM树,消耗内存空间
	2.方便进行文档的增删改...操作
SAX解析的特点:
	1.基于事件驱动逐行解析,比较节省内存空间
	2.不能进行文档的增删改,只能进行查询的操作

6.针对这两种解析的方式,不同的公司提供了不同的API的实现.

* JAXP	:SUN公司提供的一套XML的解析的API.
* JDOM	:开源组织提供了一套XML的解析的API-jdom.
* DOM4J	:开源组织提供了一套XML的解析的API-dom4j (现在一般使用这种方式解析XML配置文件)
* Jsoup :html解析器,也可以用来解析xml
* pull	:主要应用在Android手机端解析XML.

7.解析实例演示

DOM4J的入门案例步骤:
* 【步骤一】导入jar包.dom4j-1.6.1.jar
* 【步骤二】创建解析器
* 【步骤三】解析文档获得代表文档的Document对象.
* 【步骤四】获得跟节点.
* 【步骤五】从跟节点下查找其他的节点.

下载并导入解析XML时需要用的几个jar包

链接:https://pan.baidu.com/s/1u0q5-TAofJh4y439Tu_57w 
提取码:hbro 
复制这段内容后打开百度网盘手机App,操作更方便哦
<?xml version="1.0" encoding="UTF-8" ?>
<student>
    <student id="1">
        <name>张三</name>
        <age>20</age>
    </student>
    <student id="2">
        <name>李四</name>
        <age>18</age>
    </student>
</student>
package com.bianyiit.cast;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class Demo4J {
    @Test
    public void test2() throws DocumentException {
        /*1.创建解析器对象*/
        SAXReader saxReader=new SAXReader();
        InputStream inputstream = Demo4J.class.getClassLoader().getResourceAsStream("xml01.xml");
        Document document=saxReader.read(inputstream);
        /*3.获取文档的根节点*/
        Element rootElement=document.getRootElement();
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            String id = element.attribute("id").getValue();
            Element nameElement = element.element("name");
            String name = nameElement.getTextTrim();
            Element ageElement = element.element("age");
            String age = ageElement.getTextTrim();
            System.out.println("id:"+id+"name:"+name+"age:"+age);
        }
    }
    @Test
    public void test1() throws DocumentException {
        /*1.创建解析器对象*/
        SAXReader saxReader=new SAXReader();
        /*2.通过解析器加载文件*/
        String path = Demo4J.class.getClassLoader().getResource("xml01.xml").getPath();
        Document document=saxReader.read(path);
        /*3.获取文档的根节点*/
        Element rootElement=document.getRootElement();
        /*4.获取元素内容*/
        String name=rootElement.getName();
        System.out.println(name);
    }
    @Test
    public void test3() throws DocumentException {
        /*1.创建解析器对象*/
        SAXReader saxReader = new SAXReader();
        /*2.通过解析器加载文件*/
        String path = Demo4J.class.getClassLoader().getResource("xml01.xml").getPath();
        Document document = saxReader.read(path);
        /*selectNodes方法是demo4J提供的对xpath的支持方式*/
        /*List<Element> list = document.selectNodes("/student/student/name");
        for (Element element : list) {
            System.out.println(element.getTextTrim());
            String name = element.attribute("name").getValue();
            System.out.println(name);
        }*/
        Element node = (Element) document.selectSingleNode("//student[@id='1']");
        Element name = node.element("name");
        String textTrim = name.getTextTrim();
        System.out.println(textTrim);
        /*/一定是从文件的开始位置找的  //从文件的任意位置开始找的*/
    }
}

三个单元测试代码的结果依次截图如下:



注意:selectNodes方法是demo4J提供的对xpath的支持方式,可以让程序员能够让XML的任意位置开始查找节点元素

发布了73 篇原创文章 · 获赞 11 · 访问量 2445

猜你喜欢

转载自blog.csdn.net/weixin_43908333/article/details/103647257