xml的两种解析原理
xml解析方式分为两种: DOM(Document Object Model)和SAX(Simple API for XML),
首相说明,这两种方式不是针对Java的xml解析技术,而是跨语言的解析方式,比如:JavaScript中就有dom解析技术。
DOM解析原理
dom解析方式的原理:要求解析器把整个xml文档装载进一个document对象之中,该对象中包含文档元素和所有的xml中的元素。
这种解析方式的优点和缺点:
优点是:xml解析之后,整个文档的结构和关系,清晰的存在于内存之中。
缺点是:把整个文档都读入内存,如果文档内容过大,将会导致内存溢出,浪费内存。
sax解析原理
sax解析方式的原理:sax解析和dom解析是一样的,都是一行一行的读取文件的内容,但是dom是最终将整个文档都放入document ,而sax是,不会保存任何数据,也就是说,sax读取本行内容的时候,会返回当前的对象,但是上一行查询不到,当解析完整个xml的时候,sax工作也就结束了。
优点:使用sax解析xml文档,不会占用很多内存,速度快,效率高
缺点:不能完整的保存整个文档对象以及他们之间的关系,无法进行一些增删改的操作,但是如果仅仅要查询xml中的元素,sax是一个不错的选择。
dom4j解析技术
1.dom4j的定义
dom4j是一种针对Java开发的xml解析技术,不想dom技术是跨语言的。dom4j综合了dom技术和sax解析技术。
2.dom4j的类结构图:
这里与JavaScript的dom解释的方式还是有一些区别的,在这里看到attribute还是一个节点,但是在JavaScript中,属性已经不是节点了,要记住。
Branch是可以有子节点的节点,
3.dom4j创建xml文档
3.1创建xml文档对象
Document doc = DocumentHelper.createDocument();
3.2.创建根节点
1.首先创建一个元素节点
Elementroot = DocumentHelper.createElement (“root”);
2.将这个元素节点,添加到根节点位置
doc.setRootElement(root);
3.3.给元素添加属性
public Element addAttribute(Stringname,String value);
name:是指定属性名
value:指定属性值
代码;
给根元素添加属性:
root.addAttribute(“id”,”1”);
3.4.创建子元素
public Element addElement(String name);
name:指定子节点的名称
代码:
给根元素添加子元素book
Element book=root.addElement(“book”);
3.5.给元素节点添加文本节点
public void setText(Stringtext);------------将普通文本作为节点内容
public void addCDATA(String data)--------将CDATA段作为节点内容
代码;
给book节点设置文本
book.setText(“图书”);
给book设置CDATA
book.addCDATA(“小王子&鲁滨孙漂流记”);
3.6.添加注释
public Element addComment(Stirng comment);
comment:指定注释内容
代码
给book节点,添加注释
book.addComment(“这里是介绍一本书”)
3.7.输出xml到硬盘,并且设置格式和编码
输入xml的类:
XMLWriterwriter = new XMLWriter (output,format);
output:指定输出流和输出到的文件。
format:设置输出格式---是OutputFormat格式的。
OutputFormat类常用的方法:
public static OutputFormat createPrettyprint();----设置有缩进的xml文档, 不然的话就会是没有缩进的,很难看
public void setEncoding(String encoding)------设置编码集
代码
输入document到aaa.xml上面
StringfileUrl = “aaa.xml”;
OutputFormatformat = OutputFormat. createPrettyprint();
format.setEncoding(“utf-8”);
XMLWriterwriter = new XMLWriter(new FileWriter(fileUrl),format);
writer.write(doc);
writer.close();
3.8.一个完整的实例
publicclass CreateXml {
publicstatic void main(String[] args) throws Exception {
Documentdocument = DocumentHelper.createDocument();
Elementroot = document.addElement("book");
document.setRootElement(root);
root.addComment("这是一个描写书的xml");
Elementbname = root.addElement("bname");
bname.addComment("这是书名");
bname.addAttribute("id","1");
bname.setText("linux从入门到精通");
Elementbauthor = root.addElement("bauthor");
bname.addAttribute("id","2");
OutputFormatformat = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriterxmlWriter = new XMLWriter(new FileOutputStream(new File("src/b1.xml")),format);
xmlWriter.write(document);
xmlWriter.close();
}
}
结果:
<?xml version="1.0" encoding="utf-8"?>
<book>
<!--这是一个描写书的xml-->
<bname id="2">
<!--这是书名-->linux从入门到精通
</bname>
<bauthor/>
</book>
4.解析xml文档
4.1.创建解析器
SAXReader reader = new SAXReader();
4.2.构建xml文档对象
解析器对象,有一个read方法,就可以创建文本对象
public Document read(File file) throwsDocuemtException
file:用于指定要解析的xml文件。
String fileUrl =“aaa.xml”;
Documentdoc = reader.read(new File(fileUrl));
4.3.获取根节点
public Element getRootElement();
返回值:根节点对象,Element类型
代码;
获取根节点
Element root = doc. getRootElement();
4.4.获取子节点
1.获取元素节点中的第一个指定名称的子元素节点
publicElement element(String name);
name:用于指定获取子节点的名字
代码:
返回根节点中名字为book的子元素节点
Elementbook = root.element(“book”);
2.获取元素节点中的所有指定名字的子元素节点
public List elements(Stringname);
name:指定的元素的名字
返回值:list集合
代码:
返回根节点中名字为book的所有子元素节点
List<Element>books= root.elements(“book”);
4.5.删除元素节点的属性,文本,和子节点
remove(Element ele);----------删除指定的子元素节点
remove(Attribute att);----------删除元素的属性
remove(Text text);-------------删除元素的文本
5.dom4j对xpath的支持
5.1.xpath是什么:
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。xpath使用路径表达式来选取文档中的节点或者节点集,注意xpath是把xml文档中的属性,元素,文本,注释,等都封装成了节点对象,请参照上面的图,对nodes操作。使用路径的方式来进行操作。
5.2.dom4j中xpath的使用
在DOM4J中,Node接口中的三个方法最为常用:
l List selectNodes(String xpathExpression):在当前节点中查找满足XPath表达式的所有子节点;
l Node selectSingleNode(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点;
l String valueOf(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点的文本内容;
5.2.1常见的xpath表达式的写法:
* 可以直接获取到某个元素
*第一种形式
/AAA/DDD/BBB:表示一层一层的,AAA下面 DDD下面的BBB
*第二种形式
//BBB:表示和这个名称相同,表示只要名称是BBB,都得到
*第三种形式
/*:所有元素
*第四种形式
** BBB[1]: 表示第一个BBB元素
×× BBB[last()]:表示最后一个BBB元素
*第五种形式
**//BBB[@id]: 表示只要BBB元素上面有id属性,都得到
*第六种形式
**//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
5.2.2.xpath的具体操作
**默认的情况下,dom4j不支持xpath
**如果想要在dom4j里面是有xpath
*第一步需要,引入支持xpath的jar包,使用 jaxen-1.1-beta-6.jar
**需要把jar包导入到项目中
**使用xpath实现:查询xml中所有name元素的值
**所有name元素的xpath表示: //name
**使用selectNodes("//name");
**代码和步骤
/*
* 1、得到document
* 2、直接使用selectNodes("//name")方法得到所有的name元素
*
* */
//得到document
Documentdocument = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//使用selectNodes("//name")方法得到所有的name元素
List<Node>list = document.selectNodes("//name");
//遍历list集合
for(Node node : list) {
//node是每一个name元素
//得到name元素里面的值
Strings = node.getText();
System.out.println(s);
}
**使用xpath实现:获取第一个p1下面的name的值
*//p1[@id1='aaaa']/name
*使用到selectSingleNode("//p1[@id1='aaaa']/name")
*步骤和代码
/*
* 1、得到document
* 2、直接使用selectSingleNode方法实现
* -xpath : //p1[@id1='aaaa']/name
* */
//得到document
Documentdocument = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//直接使用selectSingleNode方法实现
Nodename1 = document.selectSingleNode("//p1[@id1='aaaa']/name"); //name的元素
//得到name里面的值
Strings1 = name1.getText();
System.out.println(s1);