小毛驴解析

XML解析

    

     解析XML的步骤:
    * 1、创建SAXReader
    * 2、创建File对象来描述文件
    * 3、使用SAXReader读取文件(解析的过程)
    *    并返回Document对象,其封装了整棵树
    * 4、通过Document获取根元素(根标签)
    * 5、根据XML的结构获取不同节点预计对应的信息

  

 XML解析方式

1. SAX解析方式

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。

而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。

其优缺点分别为:
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改

2. DOM解析方式

DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中的所有元素,

按照其出现的层次关系,解析成一个个Node对象(节点)。

其优缺点分别为:
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长

 

读取XML

1. SAXReader读取XML文档

使用SAXReader需要导入dom4j-full.jar包。其是DOM4J的一个核心API,用于读取XML文档。
DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。

我们使用了SAXReader读取了一个指定的文件,那么调用的方法是:

Document reader(File file)

该方法会读取给定的文件,并将其封装到一个名为Document的对象中。

2. Document的getRootElement方法

Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。
当我们得到Document后就相当于我们得到了XML描述的整个树结构。那么我们就来开始解析的第一步工作,获取根元素。
获取根元素前,我们还需要提一下一个名为Element的类。

Element用于描述XML中的一个元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。

Document的方法:
Element getRootElement()

用来获取当前XML文档中的根元素。

 Element

1. element方法

当我们通过解析XML得到一个Element对象时,如何获取该对象所表示的元素的一些相关信息呢?
其中Element提供了一个方法:
Element element(String name)
该方法用于获取当前元素下指定名字的子元素。

若当前元素下包含若干个同名子元素,那么element方法会获取该元素中第一个子元素。
若我们希望获取当前元素下所有同名的子元素,我们可以使用elements方法。
2. elements方法

Element提供了另一个方法用于获取当前元素下所有子元素,其方法为:
List elements()

elements还有重载方法,比如我们希望获取当前元素下同名的所有子元素时,我们可以使用:
List elements(String name)
该方法会获取当前元素下所有给定名字的子元素。

3. getName方法

Element提供了一个方法,用于获取当前元素的名字:
String getName()

4. getText方法

Element还提供了一个方法,用于获取元素的文本节点(其实标记与结束标记之间的文本)
String getText()


5. attribute方法

Element的attribute方法用于获取当前元素的属性信息,其方法定义为:
Attribute attribute(int index)
获取当前元素的指定属性,index为索引,从0开始。
Attribute attribute(String name)
获取当前元素的指定名字的属性。

 Attribute

1. getName方法和getValue方法

Attribute类的每一个实例用于描述一个元素中的某个属性信息。根据该对象我们通常会获取其对应的属性名与属性值的信息,这两个信息的获取依靠下列方法:
String getName() : 获取属性的名字
String getValue() : 获取属性的值

/**
 * 测试attribute方法 
 */
public static void testAttribute(Element element){
    //获取当前元素的第一个属性
    Attribute attr = element.attribute(0);
    System.out.println(attr.getName());
    System.out.println(attr.getValue());
} 

  

/**
 * 测试使用DOM解析xml
 */

public class TestReadXml {
    public static void main(String[] args) {
        try {
            //导入org.dom4j.*
            SAXReader reader =new SAXReader();
            //java.io.File
            File xmlFile =new File("emp.xml");
            /*
             * 解析xml 返回对应的Document对象
             * 该对象封装了xml文档中所有的内容
             */
            Document doc =reader.read(xmlFile);
            /*
             * 获取根标签(xml中的List标签)
             */
            Element root = doc.getRootElement();
            /*
             * 获取根标签(根元素)下的所有子标签(子元素)
             * 获取所有的
             */
            List<Element> elements =root.elements();
            /*
             * 获取当前标签下所有名字为emp的子标签
             */
            //List<Element> elements =root.elements(emp);
            
            //遍历所有子标签emp
            for(Element element:elements){
                System.out.println("标签:"+element.getName());
                //获取emp标签的ID属性值
                Attribute attribute =element.attribute("id");
                //获取该属性的值(id属性的值)
                int id =Integer.parseInt(attribute.getValue());
                System.out.println("员工ID:"+id);
                //获取emp标签中的name标签
            Element nameEle    =element.element("name");
            /*getText() 方法用于获取前标记和后标记之间的文本
             * <name>张三</name>
             * 若nameEle 描述的是name标签
             * 则nameEle.getText() 方法获取的事字符串 张三
             * 调用该方法应确保name标签中是文本信息
             */
            String name =nameEle.getText();
            System.out.println("员工名字:"+name);
            /*
             * 获取年龄
             * 我们希望获取emp标签中的子标签age中的文本
             * 两种方式:
             * 1.先获取age标签 在获取其中的文本 这个和上面获取name的方法一致
             * 2.字节调用elementText()方法
             * 例如:element.elementText("age")
             * 可以获取当前标签(emp)中名为age的标签中的文本
             * 这种写法更简洁
             */
            int age =Integer.parseInt(element.elementText("age"));
            System.out.println("员工年龄:"+age);
            //获取性别
            String gender =element.elementText("gender");
            System.out.println("员工性别:"+gender);
            //获取工资
            int salary =Integer.parseInt(element.elementText("salary"));
            System.out.println("员工工资"+salary);
            }
        } catch (Exception e) {
            
        }
    }
}
View Code
 1 /**
 2  * 该类用来描述XML文件中一个员工的信息
 3  * 这种设计方式要习惯
 4  * 对于一个表格保存的所有数据而言,有多少列(字段)
 5  * 我们这里就对应定义相应类型的属性
 6  * 这样我们可以用该类的每一个实例保存表格中每一行数据
 7  * @author Administrator
 8  *vo : value object
 9  */
10 class Emp{
11     private int id;
12     private String name;
13     private int age;
14     private String gender;
15     private int salary ;
16     public Emp(int id, String name, int age, String gender, int salary) {
17         super();
18         this.id = id;
19         this.name = name;
20         this.age = age;
21         this.gender = gender;
22         this.salary = salary;
23     }
24     public int getId() {
25         return id;
26     }
27     public void setId(int id) {
28         this.id = id;
29     }
30     public String getName() {
31         return name;
32     }
33     public void setName(String name) {
34         this.name = name;
35     }
36     public int getAge() {
37         return age;
38     }
39     public void setAge(int age) {
40         this.age = age;
41     }
42     public String getGender() {
43         return gender;
44     }
45     public void setGender(String gender) {
46         this.gender = gender;
47     }
48     public int getSalary() {
49         return salary;
50     }
51     public void setSalary(int salary) {
52         this.salary = salary;
53     }
54     @Override
55     public String toString() {
56         return "Emp [id=" + id + ", name=" + name + ", age=" + age
57                 + ", gender=" + gender + ", salary=" + salary + "]";
58     }
59     
60 }
View Code
/**
 * 根据给定的xml文件名将该xml文件中的所有员工信息
 * 存入一个List集合中并返回
 * @author Administrator
 *
 */
class XmlUtil {
    private static String xmlFileName;

    public static List<Emp> main(String[] args) {
        List<Emp> list =new ArrayList<Emp>();
        try {
            /*
             * 解析XML的步骤:
             * 1、创建SAXReader
             * 2、创建File对象来描述文件
             * 3、使用SAXReader读取文件(解析的过程)
             *       并返回Document对象,其封装了整棵树
             * 4、通过Document获取根元素(根标签)
             * 5、根据XML的结构获取不同节点预计对应的信息
             */
            SAXReader reader =new SAXReader();
            File file =new File(xmlFileName);
            Document document =reader.read(file);
            Element root =document.getRootElement();
            //5
            List<Element> elements =root.elements();
            //遍历每一个emp标签
            for(Element empEle:elements){
                int id =Integer.parseInt(empEle.attribute("id").getValue());
                String name = empEle.elementText("name");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

 

 



posted on 2015-05-19 15:43  manue1  阅读(1054)  评论(0编辑  收藏  举报

导航