Xml:eXtendsible markup language可扩展的标记语言

Xml有什么用?

1、可以用来保存数据

2、可以用来做配置文件

3、数据传输载体

<?xml version="1.0" encoding="UTF-8"?>
<stus>
    <stu>
        <name>张三</name>
        <age>19</age>
    </stu>
    <stu>
        <name>李四</name>
        <age>19</age>
    </stu>
</stus>

定义xml

>其实就是一个文件,文件后缀为.xml

文档声明

<?xml version="1.0" ?>//version:解析这个xml,使用什么版本解析器解析
<?xml version="1.0" encoding="gbk" ?>//encoding解析这个xml,使用什么编码来翻译
<?xml version="1.0" encoding="gbk" standalone="no" ?>//standalone:no-该文档会依赖关联其他文档,yes:这是一个独立文档

encoding详解

>在解析这个xml的时候,用什么编码去解析   ---解码

电脑上的文件在保存的时候并不是存储的文字,而是存储这些文字对应的二进制。那么这些文字对应的二进制到底上多少呢?根据文件使用的编码来得到

所以要想让我们的xml能够正常的显示中文,有两种解决办法

1、让encoding是gbk或者gb2312

2、如果encoding是utf-8,那么保存文件的时候也必须使用utf-8

3、保存的时候见到的ANSI对应的是gbk编码

为了通用,建议使用utf-8编码保存,以及encoding都是utf-8

元素定义(标签)

1、其实就是里面的标签,<>扩起来的都叫元素.成对出现:

<stu>

</stu>

2、文档声明下来的第一个元素叫做根元素<根标签>

3、标签里面可以嵌套标签

4、空标签

即是开始,也是结束,一般配合属性使用。

<stu>
    <name>张三</name>
    <age/>//空标签
</stu>

5、标签可以自定义

XML 命名规则

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

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

可使用任何名称,没有保留的字词。

简单元素 && 复杂元素

简单元素:元素里面包含了普通文字

复杂元素:元素里面包含了其他元素

属性的定义

>定义在元素里面,<元素名称 属性名称=“属性值”></属性名称>

xml注释

与html的注释一样,

<!-- -->

xml的注释不允许放在文档第一条,必须在文档声明之后。

xml CDATA

如果某段字符串里面有过多的字符,并且里面包含了类似标签或者关键字的这种文本,不想让xml解析器去解析,那么可以使用CDATA来包装。不过这个CDATA一般比较少看到,通常在服务器给客户端返回数据的时候。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束

<![CDATA[<a href="www.baidu.com">啦啦啦</a>]]>

 

非法字符:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

 XML解析方式

DOM(document object model)解析

把整个xml全部读到内存当中,形成树状结构。整个文档称为document对象,属性对应attribute对象,所有元素节点对应element对象,文本也可以称为text对象,以上所有对象都可以称为Node节点。如果xml特别大,那么将会造成内存溢出。如果文档比较小会比较快。可以对文档进行增删操作。

SAX(Simple API for Xml)基于事件驱动

读一行,解析一行。不会造成内存溢出。不可以进行增删,只能查询。

 Xml dom4j基本用法

<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里有两个学生  -->
<stus>
	<stu id="10086">
		<name>张三</name>
		<age>18</age>
		<adress></adress>
	</stu>
	<stu id="10087">
		<name>李四</name>
		<age>28</age>
	</stu>
</stus>

  

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

import javax.lang.model.element.Element;
import javax.swing.text.Document;

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

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            //1、创建sax读取对象
            SAXReader reader = new SAXReader();
            //2、指定解析的xml源
            org.dom4j.Document document = reader.read("src/xml/stus.xml");
            //3、得到元素,得到根元素
            org.dom4j.Element rootElement = document.getRootElement();
            
            System.out.println(document.getName());
            System.out.println(rootElement.getName());
            System.out.println(rootElement.element("stu").getName());
            System.out.println(rootElement.element("stu").element("age").getName());
            System.out.println(rootElement.element("stu").element("age").getData());
            System.out.println(rootElement.element("stu").element("age").getText());
            //获取根元素下面的所有自元素。stu元素
            List<org.dom4j.Element> elements= rootElement.elements();
            //遍历所有的stu元素
            for(org.dom4j.Element element : elements) {
                String name=((org.dom4j.Element) element).element("name").getText();
                Object age=((org.dom4j.Element) element).element("age").getText();
                System.out.println("name:"+name+",age:"+age);
            }
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Dom4j的Xpath使用

1、dom4j里面支持XPath的写法,xpath其实是xml的路径语言,支持我们在解析xml的时候能够快速定位到具体的某一个元素。

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

import javax.lang.model.element.Element;
import javax.swing.text.Document;

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

public class XpathTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			//1、创建sax读取对象
			SAXReader reader = new SAXReader();
			//2、指定解析的xml源
			org.dom4j.Document document = reader.read("src/xml/stus.xml");
			//3、得到元素,得到根元素
			org.dom4j.Element rootElement = document.getRootElement();
			
			//要想使用xpath,还得添加真实的jar
			org.dom4j.Element nameElement =(org.dom4j.Element) rootElement.selectSingleNode("//name");
			System.out.println(nameElement.getText());
			
			List<org.dom4j.Element> list=rootElement.selectNodes("//name");
			
			for(org.dom4j.Element element:list) {
				System.out.println(element.getText());
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

XML约束

如下的文档,属性的id值是一样的,这在生活中是不可能出现的,并且第二个学生的姓名有好几个。一般也很少。那么怎么规定ID的值唯一或者是元素只能出现一次,不能出现多次呢?甚至是规定里面只能出现具体的元素名称。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里有两个学生  -->
<stus>
    <stu id="10086">
        <name>张三</name>
        <age>18</age>
        <adress></adress>
    </stu>
    <stu id="10086">
        <name>李四</name>
        <age>28</age>
    </stu>
</stus>

###DTD

  语法自成一派,早起就出现了,可读性比较差。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd来约束这个xml  -->
<!-- 文档类型 根标签名字 网络上的dtd dtd的名称 dtd的路径 -->
<!-- <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->
<!-- 引入dtd的方式:根标签名字 引入本地dtd dtd的位置 -->
<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->
<!DOCTYPE stus[
<!-- + 1个或多个 , *0个或多个 ,?0个或1个 -->
<!ELEMENT stus (stu)+>
<!ELEMENT stu (name,age)> <!--两个都有-->

<!ELEMENT stu (name | age)> <!--两个选一个-->
<!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST stu id CDATA #IMPLIED> ]> <stus> <stu id="10086"> <name>张三</name> <age>18</age> </stu> <stu id="10086"> <name>张三</name> <age>18</age> </stu> </stus>

###Schema

  其实就是一个Xml,使用xml的语法规则,xml解析起来比较方便,是为了替代DTD但是Schema约束文本内容比DTD还要多,所以目前也没有真正意义上的替代DTD。

 

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.example.org/teacher" 
xmlns:tns="http://www.example.org/teacher" elementFormDefault="qualified">

<element name="teachers">
    <complexType>
        <sequence>
            <element name="teacher">
                <!-- 用来声明这个teacher元素是复杂元素 -->
                <complexType>
                    <sequence>
                        <!-- 以下是简单元素 -->
                        <element name="name" type="string"></element>
                        <element name="age" type="int"></element>
                    </sequence>
                </complexType>
            </element>
        </sequence>
    </complexType>
</element>

</schema>