xml学习

概述


xml和html一样都是标签语言
xml:eXtensible Markup Language
可扩展标记语言

该标记语言作为接口语言使用的非常多
html:标签是固定标签,负责数据展示,结构和样式结合在一起,HTML语法松散
xml:标签是可以自定义的,负责数据存储,结构和样式分离,XML语法严格

两种方式对比

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>学生信息</title>
	</head>
	<body>
		<table border="1">
		
		<thead></thead>
		<tbody>
			<tr>
				<th>学号</th>
				<th>姓名</th>
				<th>地址</th>
				<th>专业</th>
			</tr>
			<tr>
				<td>01</td>
				<td>張三</td>
				<td>學校</td>
				<td>計算機</td>
			</tr>
		</tbody>
		</table>
	</body>
</html>

xml

<?xml version="1.0" encoding="utf-8">
<student>
	<学号>01</学号>
	<姓名>张三</姓名>
	<地址>学校</地址>
	<专业>计算机</专业>
</student>

这里属性可能还有:standalone 是否允许使用外部声明(yes/no)yes指不适用外部声明

XML 元素必须遵循以下命名规则:

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

xml历史
1998年出现,背景需要把html替换掉
xml的作用:

  • 可以当做小型数据库使用
  • 许多软件的配置文件也通过xml保存对应的信息,列项目中数据库主机名,密码,用户名
  • 许多媒体工作也通过xml文件保留用户之前看到的信息
  • 可以在网站里面当接口使用

编写xml的标准


  1. 声明处理指令,第一行必须定义为文档声明(DTD)
  • 格式:<?xml 属性列表 ?>
<?xml version="1.0" encoding="utf-8" standalone="no"?>
  • 属性:
  • version:版本号,必须的属性
  • encoding:编码方式。文档使用的字符集,默认值ISO-8859-1
  • standalone:是否独立使用,如果是yes,则表示这个XML文档是独立的,不能引用外部的DTD规范文件;如果是no,则该XML文档不是独立的,表示可以引用外部的DTD规范文档。默认为no
  1. 文档的树状结构:有且只有一个根节点
  2. 标签必须闭合
  3. 标签大小写一致(建议小写)
  4. 属性全都小写,属性必有值,值必须有引号
  5. 标签可以嵌套
  6. 特殊符号必须要是符号实体,类似这个html,不用符号实体也行使用<!CDATA[]>来表示,CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出
  7. 空标记闭合单标签
  8. xml标签名字的组合部分,可以使用汉字当标签但不建议
  9. 处理指令
    简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容:
<?xml-stylesheet type="text/css" href="users.css"?>

案列获取无广告视屏


在这里插入图片描述

DOM对Xml的解析处理


解析方法:DOM,DOM4J,SAX

(1)DOM(JAXP Crimson解析器)
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。要求解析器把整个XML文档装载到内存,并解析成一个Document对象,DOM以及广义的基于树的处理具有几个优点,首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改,可以进行增删改查操作。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
(2)SAX
处理的优点非常类似于处理流的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多,缺点:只能读,逐行解析后将释放资源。

选择DOM还是选择SAX? DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
(3)DOM4J
它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能

为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。

(4)比较

  • 如果不考虑可移植性,那就采用DOM4J.
  • JDOM和DOM在性能表现不佳,在小文档情况下还值得考虑使用DOM和JDOM。DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
  • SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

使用Dom4J的API解析XML文件


1.把整个要解析的XML文件加载到内存(Dom4J提供了一个核心类SAXReader,用来加载XML文件)

2.通过SAXReader的read()方法获取Document对象
注:SAXReader:Dom4j读取解析XML文件的api,可以将一个xml文件读取解析为Document对象。

3.通过Document对象的getRootElement()方法获取根标签
注:读取内存中的Document对啊ing,就相当于读取了xml文件的内容,document对象提供了查找根元素的方法。

4.通过根标签的attributeValue(属性名)获取根标签的属性值

5.通过根标签的elements方法获取根标签的子标签集合

6.遍历子标签集合

DOM4j的常用对象(使用之前需要导入jar包)

  • SAXReader:读取xml文件到Document输结构文件对象
  • Document:是一个xml文档对象树,类比html文档对象
  • Element:元素节点,通过Document对象可以查找单个元素

列如:

package com.itcast.xml;

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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException, DocumentException {
        //获取xml的地址
       // System.out.println(new File("F:\\TestXml\\books.xml").getCanonicalPath());
        //xml解析
        //1.获取解析器
        SAXReader reader = new SAXReader();
        String path = Test.class.getResource("/Application.xml").getPath();

        //2.获取文档
         Document document = reader.read(new FileInputStream(new File(path)));
//        System.out.println(document.getNodeType());//返回文件的本身9
//        System.out.println(document.getNodeTypeName());//Document
        //获取根目录
        Element elementRoot = document.getRootElement();
        System.out.println(elementRoot);//org.dom4j.tree.DefaultElement@7cca494b [Element: <books attributes: []/>]
        System.out.println(elementRoot.getName());//books
        System.out.println(elementRoot.getNodeType());//1
        System.out.println(elementRoot.getNodeTypeName());//Element
        //获取所有子标签
        List<Element> list = elementRoot.elements();
        for (Element a : list){
            System.out.println(a);
        }
        //返回三个book
        /*
        org.dom4j.tree.DefaultElement@7ba4f24f [Element: <book attributes: [org.dom4j.tree.DefaultAttribute@3b9a45b3 [Attribute: name id value "001"]]/>]
org.dom4j.tree.DefaultElement@7699a589 [Element: <book attributes: [org.dom4j.tree.DefaultAttribute@58372a00 [Attribute: name id value "002"]]/>]
org.dom4j.tree.DefaultElement@4dd8dc3 [Element: <book attributes: [org.dom4j.tree.DefaultAttribute@6d03e736 [Attribute: name id value "003"]]/>]
         */


    }
}

XML实体引用


&lt; :< (小于)

&gt; :>  (大于)

&amp :&(与)

&apos; :'(单引号)

&quot; :" (双引号)

PCADTA 指被解析的字符数据:

CDATA段 格式:<![CDATA[文本内容]]>

文本内用不会被解析,并且结尾']]>'不能有空格和换行。

xml节点


直接举列子:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5">
    <servlet>
        <servlet-name>HelloMyServlet</servlet-name>
        <servlet-class>com.jourwon.HelloMyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloMyServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

节点结构:
在这里插入图片描述
假设想要遍历,使用迭代方法一级一级迭代,也可以使用增强foreach,这里除了这4个节点还有其他节点,自己翻阅即可符合w3c标准

入门了解一个Schema约束


  1. 什么是Schema约束?
    Schema是新的XML文档约束;
    Schema要比DTD强大很多,是DTD 替代者;
    Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
    Schema 功能更强大,数据类型更完善
    Schema 支持名称空间
  2. XML Schema 约束的作用?
    定义可出现在XML文档中的元素
    定义可出现在XML文档中的属性
    定义哪个元素是子元素
    定义子元素的次序
    定义子元素的数目
    定义元素是否为空,或者是否可包含文本
    定义元素和属性的数据类型
    定义元素和属性的默认值以及固定值
    Schema与DTD一样,可以通过schema约束文档编写xml文档,常见的框架使用schema的如Spring等
<?xml version="1.0" encoding="UTF-8"?>
<!--
	如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
	格式如下:
	<beans xmlns="http://www.hahaha.com/bean"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.hahaha.com/bean bean-schema.xsd"
	>
-->

<!-- 
xmlns="http://www.w3.org/2001/XMLSchema"
表示 bean-schema.xsd 中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema"。

targetNamespace="http://www.hahaha.com/bean"
表示 当前约束文档bean-schema.xsd 在网络中的唯一标识(命名空间), 命名空间的值是唯一的,不可重复 

elementFormDefault="qualified"
表示 引用bean-schema.xsd约束文档的 任何XML文档所使用的元素,必须是在此 bean-schema.xsd 中声明过的,没声明过的元素不可使用
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.hahaha.com/bean"
        elementFormDefault="qualified">
    <!-- 声明根标签 -->
    <element name="beans">
        <!-- complexType 复杂的类型,代表里面有子元素 -->
        <complexType>
            <!-- 
				<choice> 规定可出现某个子元素或者可出现另外一个子元素(非此即彼):
				<minOccurs> 规定某个元素能够出现的最小次数
				<maxOccurs> 规定某个元素可出现的最大次数
				如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明
 			-->
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <!-- <sequence> 规定子元素必须按照特定的顺序出现 -->
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="required"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>
</schema>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值