使用dom4j解析XML文档

用前一篇文章所创建的xml文档来做试验了,完整内容如下:


<?xml version="1.0" encoding="GBK"?>
<breakfast_menu>
     <!--这是根节点-->
 <food>
    <name>hamburger</name>
    <name>汉堡包</name>
    <price currency="dollar">$1.95</price>
    <description>A sandwich made with a patty bun......</description>
    <calories unit="kCal">260</calories>
 </food>
 <food>
     <name>Strawberry Belgian Waffles</name>
     <name>华夫饼 </name>
     <price currency="dollar">$7.95</price>
     <description>light Belgian waffles covered...</description>
     <calories unit="kCal">900</calories>
  </food>
  <food>
     <name>Berry-Berry Belgian Waffles</name>
     <name>不知道什么鸟东西 </name>
     <price currency="dollar">$8.95</price>
     <description>为了美观描述就写少点了 ......</description>
     <calories unit="kCal">900</calories>
  </food>
</breakfast_menu>

首先要导入dom4j组件中的两个包,一个是dom4j-1.6.1.jar文件,另一个lib文件夹下的jaxen-1.1-beta-6.jar包。
java代码,写的乱,发现写注释会更乱


import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
public static void main(String[] args) throws Exception {
        // 从文件读取XML,输入文件名,返回XML文档
        File file = new File("E:"+File.separator+"001.xml");
        SAXReader reader = new SAXReader();     
        Document doc =  reader.read(file);
        Element root = doc.getRootElement();    //获取根节点

        for (Iterator i = root.elementIterator(); i.hasNext(); ) {
            Element el = (Element) i.next();

            List<Element> list = el.elements("name");
            System.out.println(list.get(0).getName()+":"+list.get(0).getText());
            System.out.println(list.get(1).getName()+":"+list.get(1).getText());

            Element price = el.element("price");    
            System.out.println("标签名为:"+price.getName());    
            System.out.println("该节点值为:"+price.getText());   

            Element description = el.element("description");
                    System.out.println("该父元素为:"+description.getParent().getName());
            System.out.println(description.getNodeType());  

            Element calories = el.element("calories");
            Attribute ca = (Attribute) calories.attributes().get(0);    //取得节点属性
            System.out.println(ca.getName()+":"+ca.getValue());         
            System.out.println("属性unit的值为:"+calories.attributeValue("unit"));

            System.out.println("=========================");
        }
    }
}

dom4j解析xml文档的大致步骤

第一步. 使用 org.dom4j.io.SAXReader 类的read(String fileName)方法读取并解析xml文档,返回org.dom4j.Document 接口的一个对象;



                // 实例化SAXReader对象,调用read()方法读取XML文档,返回XML文档
                SAXReader reader = new SAXReader();
                Document doc = reader.read(new File(fileName));

第二步.取得根节点,返回org.dom4j.Element 接口的一个对象;


                    //获取ROOT(根)节点
                    Element root = doc.getRootElement();

第三步 . 遍历XML树(枚举(Iterator)、递归 、Visitor模式),上面的代码用了下面的方式实现。



                        // 枚举所有子节点
              for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
                       Element el = (Element) i.next();
                       // do something
                    }

============ 结合上面的实例整理一些dom4j解析xml的常用API ===============

获取子节点的两种方法:element(String name)和elements(String name)

1 . 文档中 price 、description 、calories 这三个标签在根节点中的名称都是唯一的,因此可以用element();


            //获取<price> 、<description> 、<calories>节点
            Element price = el.element("price");
            Element calories = el.element("calories");
            Element description = el.element("description");

2 . 而 name 标签在根节点下并不是唯一的,需要用elements(),并且用List接受


            //获取所有<name>节点
            List<Element> list = el.elements("name");

org.dom4j.Element接口下几个常用方法;

1 . getName()方法,用于返回节点名称。


            //取得<price>的节点名
            Element price = el.element("price");    
        System.out.println("标签名为:"+price.getName());    //结果为:price

2 . getText() 方法 ,用于返回节点值。


            //取得<price>的节点值
           Element price = element.element("price");    
       System.out.println("该节点值为:"+price.getText());    //第一次结果为:$1.95

3 . attributes方法, 返回该元素的属性列表


             //取得<calories unit="kCal">中的属性列表,若有多个用get(i)依次获取
            Element calories = element.element("calories");
            Attribute ca = (Attribute) calories.attributes().get(0);    //取得第一个节点属性

4 . attributeValue(String name) ,根据传入的属性名获取属性值


           //取得<calories unit="kCal">中的unti属性的值
           Element calories = element.element("calories");
           System.out.println("属性unit的值为:"+calories.attributeValue("unit"));//结果为:kCal

5 . getParent() , 返回一个父元素



            Element description = el.element("description");
            System.out.println("该父元素为:"+description.getParent().getName()); //结果为food

org.dom4j.Attribute 接口下的两个方法;

1 . getName() 获取属性名 getValue() 获取属性值


        //获取<calories unit="kCal">中的属性名和属性对应的值
        Element calories = el.element("calories ");
        Attribute ca =(Attribute)calories.attributes().get(0);
        System.out.println(ca.getName()+":"+ca.getValue());  第一次结果为:unit:kCal



    ===================以后再补充======================

你可能感兴趣的:(xml,解析,dom4j,常用API)