前言
解析xml文件也是一个很重要的知识
接下来就是掩饰解析xml文件喽!
分类
解析xml文件分为两种(人家说):dom解析和sax解析。
两种解析都有各自的优缺点 ,简单概括以下就是,dom解析适合小文件的,数据量不多的xml,而另一个就恰恰相反。
XML的解析方式:
1.DOM(Document Object Model 文档对象模型)
关键字:树(Document)
优点: 把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长
2. SAX(Simple API for Xml 基于XML的简单API)
关键字:流(Stream)
把xml文件作为输入流,触发标记开始,内容开始,标记结束等动作
优点: 解析可以立即开始,速度快,没有内存压力
案例演示
这里就用idea结合maven项目演示了!
这里的文件也就是spring.xml文件。
在演示spring.xml文件之前,需要在另一个xml文件演示,已达到循序渐进的学习。
案例演示
首先是xml文件:(decp.xml)
<?xml version="1.0" encoding="UTF-8"?>
<list>
<dept id="1">
<name>综合部</name>
<createtime>2020-01-01</createtime>
<age>400</age>
<minister>孙悟空</minister>
</dept>
<dept id="2">
<name>人事部</name>
<createtime>2020-01-02</createtime>
<age>300</age>
<minister>朱悟能</minister>
</dept>
<dept id="3">
<name>研发部</name>
<createtime>2020-01-03</createtime>
<age>200</age>
<minister>白龙马</minister>
</dept>
<dept id="4">
<name>销售部</name>
<createtime>2020-01-04</createtime>
<age>300</age>
<minister>沙悟净</minister>
</dept>
<dept id="5">
<name>售后部</name>
<createtime>2020-01-05</createtime>
<age>1000</age>
<minister>唐三藏</minister>
</dept>
</list>
然后就是我们的测试了!!!
首先 的dom 解析:
DocumentBuilderFactory documentBuilderFactory= DocumentBuilderFactory.newInstance();
//创建一个Doucumentbuild对象
DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
//解析对应的xml文件(注意这里文件路径会有bug(注意))
Document doc=documentBuilder.parse("src/main/resources/decp.xml");
//根据标签名获取Node节点nodelist
NodeList nodelist=doc.getElementsByTagName("dept");
/*输出该节点 的长度*/
System.out.println(nodelist.getLength());
for(int i=0;i<nodelist.getLength();i++){
//输出此节点的节点名和内容
// System.out.println(nodelist.item(i).getNodeName()+"-- >"+nodelist.item(i).getTextContent());
//获取Node节点中的属性
NamedNodeMap attrs= nodelist.item(i).getAttributes();
//遍历获取属性
for(int j=0;j<attrs.getLength();j++) {
//返回节点
Node x=attrs.item(j);
System.out.println(x.getNodeName()+" "+x.getNodeValue());
}
}
//获取节点的另一种方法
/*
* 使用Element对象获取节点
* */
for(int i=0;i<nodelist.getLength();i++){
Element node =(Element) nodelist.item(i);
System.out.println(node.getAttribute("id"));
}
方法
你会发现这里很多都没有见过的对象,方法更是无从下手:
使用dom解析时会有包的问题:
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
这里使用的主要是org.w3c.dom.*;
首先是node方法:
getNodeName():此节点的名称,取决于其类型
getNodeValue():此节点的值,取决于其类型
getTextContent() :此属性返回此节点及其后代的文本内容。
getAttributes():包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null。
具体方法还是截图看的好一点:
然后是NamedNodeMap:
到这里第一种方式就完了!!!
使用SAX解析:
首先使用的maven项目;导入jar包:
<!--用户解析xml文件的依赖-->
<!-- dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
直接上代码:
/*
* 使用DOM4J解析XML的大致步骤
* 1:创建SAXReader
* 2:使用SAXReader读取指定的xml文档并生成Document对象
* 3:通过Document对象获取根元素
* 4:从根元素开始逐级获取子元素已达到遍历XML文档数据的目的
*/
try {
SAXReader reader=new SAXReader();
Document read = reader.read(new File("E://IDEAMaven/springLX/spring/src/main/resources/decp.xml"));
Element rootElement = read.getRootElement();
List<Element> dept = rootElement.elements("dept");
System.out.println(dept.size());
for(Element element:dept){
Element name = element.element("name");
System.out.println(name.getName());
// System.out.println(name.attributeValue("id"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
这里用到的是Element;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
方法
/*
* Document提供了获取根元素的方法:Element getRootElement()
*
* Element每个实例用于表示XML文档中的一个元素(一对标签)
* 常用方法:
* String getName()获取当前标签的名字
* String getText()获取当前标签中间的文本信息
* Element element(String name)获取当前标签中指定名字的子标签
* List elements()获取当前标签中所有子标签,返回的List集合中会包含若干的Element实例,每个实例是其中一个子标签
* List elements(String name)获取当前标签中所有同名子标签(指定的名字)
* attributeValue("id"));获取id属性值
*/
第二中方式结束;看起来简单了很多;
然后就是我们的解析spring.xml文件了,相信你如果按照代码敲一遍,就会了!
但是不排除!!
所以就直接上代码:
/*
* 使用DOM4J解析XML的大致步骤
* 1:创建SAXReader
* 2:使用SAXReader读取指定的xml文档并生成Document对象
* 3:通过Document对象获取根元素
* 4:从根元素开始逐级获取子元素已达到遍历XML文档数据的目的
*/
try {
SAXReader reader=new SAXReader();
Document read = reader.read(new File("E://IDEAMaven/springLX/spring/src/main/resources/spring.xml"));
Element rootElement = read.getRootElement();
List<Element> dept = rootElement.elements("bean");
System.out.println(dept.size());
for(Element element:dept){
// Element name = element.element("name");
System.out.println(element.getName());
System.out.println(element.attributeValue("id"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
自己找一下就可以发现小细节了!