zoukankan      html  css  js  c++  java
  • 小毛驴解析

    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;
        }
    }



  • 相关阅读:
    内存屏障指令
    k64 datasheet学习笔记45---10/100-Mbps Ethernet MAC(ENET)之功能描述
    k64 datasheet学习笔记45---10/100-Mbps Ethernet MAC(ENET)之概述
    Haskell 笔记 ③
    UVA 11754 (暴力+中国剩余定理)
    Haskell 笔记 ②
    Haskell 笔记 ①
    HDU 1072(记忆化BFS)
    POJ 2096 (概率DP)
    HDU 4405 (概率DP)
  • 原文地址:https://www.cnblogs.com/manue1/p/4514736.html
Copyright © 2011-2022 走看看