1.两种解析方式:SAX和DOM
①SAX(simple API forXML):解析可以立即开始,速度快,没有内存压力;但不能对节点做修改.
②DOM(Document Object Model):把XML文件在内存中构造树形结构,可以遍历和修改节点;
但如果文件比较大,内存会有压力,解析时间会比较长.
③使用SAXReader需要导入dom4j-full.jar包;
④示例代码:
SAXReader reader = new SAXReader();//创建SAXReader
Document doc=reader.read(new File("helloList.xml"));//读取指定文件
2 解析XML大致步骤:
1.创建SAXReader;
2.读取要解析的XML文档并生成Document对象;
这一步就是DOM解析耗时耗资源的地方了,因为需要将XML文档都读取完毕并载入内存
3.通过Document对象获取根元素;
4.按照XML文档的结构从根元素开始逐级获取子元素以达到遍历XML文档数据的目的;
3. Document提供了获取根元素的方法: Element getRootElement()
Element的每一个实例用于表示XML文档中的一个元素(一对标签)
Element提供了用于获取其表示的标签的信息的相关方法:
* String getName() 获取当前标签的名字
*
* Element element(String name) 获取当前标签中指定名字的子标签
*
* List elements() 据偶去当前标签中的所有子标签
*
* List element(String name) 获取当前标签中所有同名子标签
*
* Attribute attribute(String name) 获取当前标签中指定名字的属性
*
* String getText() 获取当前标签中间的文本数据
* Attribute的每一个实例用于表示一个属性,常用方法有:
* String getName()
* String getValue()
4.涉及到的零碎遗忘的小知识:
建表: List<Element> hellolist= new ArrayList<Element>();//泛型
for(Element em:hellolist){//遍历
}
1.创建Document队形表示一个空白文档;
2.向Document中添加根元素;
3.按照XML设计的结构向根元素中逐级添加子元素及数据;
4.创建XMLWriter
5.使用XMLWriter将Document对象写出以生成XML文档
6. Document提供方法:
ElementaddElement(String name)
向文档中添加给定名字的根元素,并将其以一个Element实例的形式返回, 以便继续对该根元素操作.
需要注意,该方法只能调用一次,因为一个文档只能有一个根元素.
* Element提供了添加信息的相关方法:
* Element addElement(String name)
* 向当前元素中追加给定名字的子元素,并以Element实例将其返回,便于操作.
*
* Element addText(String text)
* 向当前元素中添加文本信息.返回的还是当前标签.
*
* Element addAttribute(String name, String value)
* 向当前元素中添加指定属性.
①SAX(simple API forXML):解析可以立即开始,速度快,没有内存压力;但不能对节点做修改.
②DOM(Document Object Model):把XML文件在内存中构造树形结构,可以遍历和修改节点;
但如果文件比较大,内存会有压力,解析时间会比较长.
③使用SAXReader需要导入dom4j-full.jar包;
④示例代码:
SAXReader reader = new SAXReader();//创建SAXReader
Document doc=reader.read(new File("helloList.xml"));//读取指定文件
2 解析XML大致步骤:
1.创建SAXReader;
2.读取要解析的XML文档并生成Document对象;
这一步就是DOM解析耗时耗资源的地方了,因为需要将XML文档都读取完毕并载入内存
3.通过Document对象获取根元素;
4.按照XML文档的结构从根元素开始逐级获取子元素以达到遍历XML文档数据的目的;
3. Document提供了获取根元素的方法: Element getRootElement()
Element的每一个实例用于表示XML文档中的一个元素(一对标签)
Element提供了用于获取其表示的标签的信息的相关方法:
* String getName() 获取当前标签的名字
*
* Element element(String name) 获取当前标签中指定名字的子标签
*
* List elements() 据偶去当前标签中的所有子标签
*
* List element(String name) 获取当前标签中所有同名子标签
*
* Attribute attribute(String name) 获取当前标签中指定名字的属性
*
* String getText() 获取当前标签中间的文本数据
* Attribute的每一个实例用于表示一个属性,常用方法有:
* String getName()
* String getValue()
4.涉及到的零碎遗忘的小知识:
建表: List<Element> hellolist= new ArrayList<Element>();//泛型
for(Element em:hellolist){//遍历
}
字符型转为整型: Integer.parseInt(str);
1.创建Document队形表示一个空白文档;
2.向Document中添加根元素;
3.按照XML设计的结构向根元素中逐级添加子元素及数据;
4.创建XMLWriter
5.使用XMLWriter将Document对象写出以生成XML文档
6. Document提供方法:
ElementaddElement(String name)
向文档中添加给定名字的根元素,并将其以一个Element实例的形式返回, 以便继续对该根元素操作.
需要注意,该方法只能调用一次,因为一个文档只能有一个根元素.
* Element提供了添加信息的相关方法:
* Element addElement(String name)
* 向当前元素中追加给定名字的子元素,并以Element实例将其返回,便于操作.
*
* Element addText(String text)
* 向当前元素中添加文本信息.返回的还是当前标签.
*
* Element addAttribute(String name, String value)
* 向当前元素中添加指定属性.
7. XPath 按路径定位节点,对获取XML中部分数据有很良好的效果(应用比较少,但很有效)
①parseXML.Java
package happy01;
/**
* 解析XML表
* @author 爱吃木鱼的猫
*/
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class parseXML {
public static void main(String[] args){
try{
SAXReader reader=new SAXReader();//创建SAXReader
Document document=reader.read(new FileInputStream("emplist.xml"));//读取要解析的XML文档并生成Document对象
Element root=document.getRootElement();//根节点
List<Emp> empList=new ArrayList<Emp>();//创建集合用于保存从XML解析出的人员信息
List<Element> list=root.elements("emp");//获取根标签的所有子标签:这里是<list>中所有<emp>
for(Element empEle:list){
/**获取名字*/
Element nameEle=empEle.element("name");//获取到emp下的name;
String name=nameEle.getText();//获取name标签中的文本内容
/**获取年龄*/
Element ageEle=empEle.element("age");
int age = Integer.parseInt(ageEle.getText());
/**获取性别*/
String gender=empEle.elementText("gender");
/**获取身高*/
double height=Double.valueOf(empEle.elementText("height"));
/**获取 属性id*/
Attribute attr=empEle.attribute("id");
int id=Integer.parseInt(attr.getValue());
Emp emp=new Emp(id,name,age,gender,height);
empList.add(emp);//加到保存信息的集合 empList
}
for(Emp e:empList){
System.out.println(e);
System.out.println();//换行作用
}
}catch(Exception e){
}
}
}
②Emp.java
package happy01;
/**
* @author 爱吃木鱼的猫
*/
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private double height;
public Emp(){
}
public Emp(int id, String name, int age, String gender, double height) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.height = height;
}
@Override
public String toString() {
return id+","+name+","+age+","+gender+","+height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
③XML表
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>司马懿</name>
<age>500</age>
<gender>男</gender>
<height>170.5</height>
</emp>
<emp id="2">
<name>奥黛丽赫本</name>
<age>120</age>
<gender>女</gender>
<height>165.2</height>
</emp>
<emp id="3">
<name>钢铁侠</name>
<age>33</age>
<gender>男</gender>
<height>188.5</height>
</emp>
<emp id="4">
<name>波多老师</name>
<age>44</age>
<gender>女</gender>
<height>168.5</height>
</emp>
<emp id="5">
<name>白百合</name>
<age>35</age>
<gender>女</gender>
<height>170</height>
</emp>
</list>
④运行截图: