作用
1.可以用来保存一些数据(注:保存一些小数据还行,太大还是使用数据库)
2.可以用来做配置文件(java框架中很常见,所以掌握java需要对xml一些了解)
3.数据传输载体(比如在微信二次开发的时候他给你传输的格式就是xml的)
需要达到的目标
一般开发的人员需要达到:会解析xml,会写xml!了解dtd约束和Schema约束
定义
头部顶行的定义
version 表示该xml的版本
encoding 表示该xml的编码
standalone 表示该xml是否是一个独立的文档 是否有关联其他文档
一般使用第二种 写出xml的版本 和编码方式
注意:这个头部文件是必须写而且是要在第一行不然就是错误的xml文件 切记第一行 注释也算一行的 所以第一行注释也不能写 必须写头文件
###元素定义
其实xml的元素定义和html很像一样都是
<name>lcc</name> 这是平常的定义方式
<age/> 这是空标签
xml的元素必须包含在一个根元素中
就是必须由一个大的元素包含
<?xml version="1.0" encoding="UTF-8" ?>
<datas>
<data>
<name>lcc</name>
<age>23</age>
</data>
<data>
<name>ll</name>
<age>22</age>
</data>
</datas>
这就是一个简单xml文件
他包含的头文件顶行写,所有元素由一个根元素包含
元素命名规则
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
(命名尽量简单,做到见名知义)
属性的定义
<?xml version="1.0" encoding="UTF-8" ?>
<datas>
<data id="aa">
<name>lcc</name>
<age>23</age>
</data>
<data id="bb">
<name>ll</name>
<age>22</age>
</data>
</datas>
属性的定义相对元素的定义比较宽松可以任意定义
<元素名称 属性名称=“属性的值”></元素名称>
注释
注释与html的注释相同
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 我是注释 -->
<datas>
<data id="aa">
<name>lcc</name>
<age>23</age>
</data>
<data id="bb">
<name>ll</name>
<age>22</age>
</data>
</datas>
使用 的格式
CDATA
非法字符
与html相似 如果遇到 < & 需要转义才能使用
<; < 小于号
>; > 大于号
&; & 和
&apos ; ’ 单引号
"; " 双引号
####CDATA会试xml解析器不去解析里面的内容原格式输出
<aa><![CDATA[<a href="http://www.baidu.com">百度</a>]]></a>
java XML的解析
针对xml的解析java有两种类型一种是
DOM:将整个XML文档读到内存中形成一个DOM,如果XML太大就会造成内存溢出,这种读取方式可以对文档进行增删查操作
SAX:读一行,解析一行 不能进行增删操作只能进行查询操作
从效率来讲DOM比较快
对于这些解析方式java的包有很多
jaxp、jdom、dom4j
dom4j的使用
- 创建SaxReader对象
- 指定解析的xml
- 获取根元素。
- 根据根元素获取子元素或者下面的子孙元素
导入
dom4j-1.6-1.jar的包
package xml;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class test {
public static void main(String[] args) {
try {
// 1. 创建sax读取对象
SAXReader reader = new SAXReader();
// 2. 解析的xml的源
Document document = reader.read(new File("src/test.xml"));
// 3.得到根元素
Element rootElement = document.getRootElement();
// 4.根据根元素寻找子元素
System.out.println(rootElement.element("data").elementText("name"));
//5.遍历所有元素
List<Element> list = rootElement.elements();
for (Element element : list) {
String name = element.elementText("name");
String age = element.elementText("age");
System.err.println("name:"+name+" age:"+age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用xpath解析
xpath是什么呢?
https://www.runoob.com/xpath/xpath-tutorial.html
XPath 是一门在 XML 文档中查找信息的语言
(在爬虫的时候也用的到 所以可以了解下)
使用xpath比平常的解析要多导入一个包
package xml;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class test {
public static void main(String[] args) {
try {
// 1. 创建sax读取对象
SAXReader reader = new SAXReader();
// 2. 解析的xml的源
Document document = reader.read(new File("src/test.xml"));
// 3.得到根元素
Element rootElement = document.getRootElement();
// 4.根据根元素寻找子元素
// 要想使用Xpath, 还得添加支持的jar 获取的是第一个 只返回一个。
System.out.println(rootElement.selectSingleNode("//name").getText());
//5.遍历所有元素
List<Element> list = rootElement.selectNodes("//name");
for (Element element : list) {
System.err.println("name:"+element.getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果不导入jaxen-1.1-beta-6.jar
就会报如下错误
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectSingleNode(AbstractNode.java:183)
at xml.test.main(test.java:21)
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 4 more
约束
约束是指约束XML的格式
一般有:Schema和DTD需要使用的时候可以了解下 一般知道这个事情就好了,除非真正需要制定XML格式规范的时候需要使用 使用的时候查下就好了