XML基础
Posted 司机刹一脚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML基础相关的知识,希望对你有一定的参考价值。
1.xml概述
XML全称为Extensible Markup Language,意思是可扩展的标记语言。
XML的作用是存放数据,配置文件
2.xml的文件要求
文档声明格式:
<?version="1.0" encoding="UTF-8"?>
文档声明必须为<?xml开头,以?>结尾
文档声明必须从文档的0行0列位置开始
文档声明只有两个属性
version:指定xml文档版本,必须属性,因为我们不会选择1.1,只会选择1.0
encoding:指定当前文档的编码,可选属性,常用值是UTF-8
3.xml的元素
元素:element
元素是xml文档中最重要的组成部分
普通元素的结构开始标签,元素体,结束标签组成.
<hello>你好</hello>
元素体可以是元素,也可以是文本
<a><b>你好</b></a>
空元素只有开始标签,但元素必须自己闭合,<c/>
元素命名:区分大小写,不能使用空格,不能使用冒号,
必须只有一个跟元素
4.xml的属性
属性:attribute
属性是元素的一部分,它必须出现在元素的开始标签中
属性的定义格式,属性名=属性值,其中属性值必须使用单引或双引
一个元素可以有n个属性,但一个元素不能出现同名属性
属性名不能使用空格,冒号等特殊字符,必须以字母开头
xml注释
xml的注释,<!-- -->
转义字符
CDATA
<![CDATA[ <bean id="xx" className="xx"> <property name="xx" value="xx" > 1 < 3 > & " ' </property> </bean> ]]>
5.xml的约束
在xml中,可以编写一个文档来约束一个xml文档的书写规范,这称之为xml约束
常见都有DTD,Schema
通过约束文档,可以编写出具有固定格式,规定格式的xml文档
6.DTD案例代码
DTD
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id ID #REQUIRED
className CDATA #REQUIRED
type CDATA #IMPLIED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>
XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans SYSTEM "bean.dtd"> <beans> <bean id="b001" className=""> <property name="" value=""></property> <property name="" value=""></property> <property name="" value=""></property> <property name="" value=""></property> </bean> <bean id="b002" className=""></bean> <bean id="b003" className=""></bean> <bean id="b004" className=""></bean> <import resource=""></import> <import resource=""></import> <import resource=""></import> <import resource=""></import> </beans>
元素声明
7.Schema约束
Schema是新的XML文档约束;
Schema要比DTD强大很多,是DTD 替代者;
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
Schema 功能更强大,数据类型更完善
Schema 支持名称空间
<?xml version="1.0" encoding="UTF-8"?> <!-- 模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。 格式如下: <beans xmlns="http://www.itcast.cn/bean" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd" > --> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/bean" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.itcast.cn/bean" elementFormDefault="qualified"> <!-- 声明根标签 --> <element name="beans"> <complexType> <choice minOccurs="0" maxOccurs="unbounded"> <element name="bean"> <complexType> <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>
Schema命名空间
如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了
总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突
声明命名空间
默认命名空间:<xxx xmlns=””> ,使用<标签>
显式命名空间:<xxx xmlns:别名=””> , 使用<别名:标签>
1.一个xml文档中,只能出现一次“默认引用”
<beans xmlns="名称"
2.一个xml文档中,可以出现多次“显示引用”
<beans xmlns:a="名称a"
xmlns:b="名称b"
3.所有引用(默认+显示),都必须确定xsd文档位置
<beans xmlns="默认名称"
xmlns:a="名称a"
xmlns:b="名称b"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="默认名称 默认位置
名称a a位置
名称b b位置"
Schema基本语法
声明根标签
1. <element> 声明元素(标签)
2. 每一个元素必须确定类型:
complexType 复杂类型
simpleType 简单类型,一般不用,大部分都是复杂类型
3. 需要继续明确子标签出差顺序
<choice> 选择, ()
<sequence> 顺序 ,
<all> 任意
minOccurs 最少出现次数
maxOccurs 最大出现次数,unbounded 不限制(没有边)
4.<attribute>用于给元素声明属性的
use 设置属性使用, optional可选、required必选
<element name="beans"> <complexType> <choice minOccurs="0" maxOccurs="unbounded"> <element name="bean"> <complexType> <sequence minOccurs="0" maxOccurs="unbounded"> <element name="property"> <complexType> <attribute name="name" use="optional"></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>
8.XML解析
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
b) 缺点:XML文档过大,可能出现内存溢出显现。
2.SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
a) 优点:处理速度快,可以处理大文件
b) 缺点:只能读,逐行后将释放资源。
9.dom解析原理
xml DOM将整个xml文档加载到内存,生成一个DOM树,并获得一个Document对象,通过document对象就可以进行DOM操作
- SaxReader对象
a) read(…) 加载执行xml文档
- Document对象
a) getRootElement() 获得根元素
- Element对象
a) elements(…) 获得指定名称的所有子元素。可以不指定名称
b) element(…) 获得指定名称第一个子元素。可以不指定名称
c) getName() 获得当前元素的元素名
d) attributeValue(…) 获得指定属性名的属性值
e) elementText(…) 获得指定名称子元素的文本值
f) getText() 获得当前元素的文本内容
import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; public class Dom4jDemo_01 { @Test public void demo01() throws DocumentException{ //1 核心类 SAXReader saxReader = new SAXReader(); //2 获得Document(整个xml) Document document = saxReader.read("beans.xml"); //3 获得根元素 beans Element rootElement = document.getRootElement(); //4 所有子元素 bean List<Element> allBeanElement = rootElement.elements("bean"); for (Element beanEle : allBeanElement) { //4.1 bean属性 String id = beanEle.attributeValue("id"); String className = beanEle.attributeValue("className"); System.out.println("bean属性:" + id + " , " + className); //5 元素property List<Element> allPropElement = beanEle.elements("property"); for (Element propEle : allPropElement) { String name = propEle.attributeValue("name"); String value = propEle.attributeValue("value"); System.out.println("property属性:" + name + " , " + value); } System.out.println(""); } } }
被解析的xml文档
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="beanId01" className="com.learn.domain.User"> <property name="uid" value="u001"></property> <property name="username" value="jack"></property> </bean> <bean id="beanId02" className="com.learn.domain.Book"> <property name="bid" value="b001"></property> <property name="title" value="标题"></property> </bean> </beans>
以上是关于XML基础的主要内容,如果未能解决你的问题,请参考以下文章
xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException
从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration