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){//遍历
}
5.写出XML文档的大致步骤:
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>
④运行截图: