Xml
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>