小毛驴解析

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;

    }

}

 

 



你可能感兴趣的:(解析)