最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Digester解析XML文件的三種方式小結(jié)

 更新時間:2024年01月26日 08:40:26   作者:代碼哲學(xué)  
Digester是apache開源項目Commons中的一個子項目,用于解析XML文檔的工具,本文為大家整理了Digester解析XML文件的三種方式,希望對大家有所幫助

1. Digester解析XML文件的三種方式

作用及依賴jar包

首先明白Digester是干什么的?它是apache開源項目Commons中的一個子項目,用于解析XML文檔的工具。Digester底層采用的是SAX解析方式,通過遍歷XML文檔規(guī)則來進行處理。項目中有需要將XML文件中的信息解析為我們需要的內(nèi)容時(如java類),使用Digester是非常方便的。話不多說,本案例使用的jdk版本是1.6。簡單的jar包依賴如下:

  • commons-digester-1.8.jar
  • commons-logging.jar
  • commons-collections-3.2.1.jar
  • commons-beanutils-1.7.0.jar

2. 重點和難點

重點:理解棧的概念

難點:當(dāng)使用addObjectCreate()方法時,會創(chuàng)建一個對象進棧,許多重要的方法都是相對于棧頂元素或次棧頂元素來進行的。

如:

addCallMethod(pattern, methodName):調(diào)用棧頂元素的指定方法

addCallMethod(pattern, methodName, paramCount):調(diào)用棧頂元素的指定方法,可指定方法的參數(shù)個數(shù)

addCallMethod(pattern, methodName, paramCount, paramTypes):調(diào)用棧頂元素的指定方法,可指定方法的參數(shù)個數(shù),類型

3. XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<Orders>
    <Order user="張三" date="2008-11-14" price="12279">
    
        <goods id="1">
            <name>IBM筆記本</name>
            <price>8999</price>
            <count>1</count>
            <total_price>8999</total_price>
        </goods>
        
        <goods id="2">
            <name>雅戈爾西服</name>
            <price>1300</price>
            <count>2</count>
            <total_price>2600</total_price>
        </goods>
    
    </Order>
</Orders>

4. 通過不同的方式解析這個xml文件

4.1 通過java編碼方式解析(javabean存儲)

根據(jù)這個xml文件的各個節(jié)點得出,我們可以創(chuàng)建兩個javabean來存儲解析信息。分別為Order.java和good.java。

// 訂單類
package cn.com.bean;

import java.util.ArrayList;
/**
 * Order.java:訂單類
 * @author ypykip
 *
 */
public class Order {
    private String user;    //對應(yīng)<Order>標(biāo)簽中的user屬性
    private String date;    //對應(yīng)<Order>標(biāo)簽中的date屬性
    private String price;   //對應(yīng)<Order>標(biāo)簽中的price屬性
    //對應(yīng)<Order>標(biāo)簽下的所有<good>標(biāo)簽
    private ArrayList<Goods> goodsList = new ArrayList<Goods>();
    //省略getter和setter...

    // 添加商品到訂單
    public void add(Goods goods){
        this.getGoodsList().add(goods);
    }
    // 重寫toString()方法,方便于觀察結(jié)果
    @Override
    public String toString() {
        return "Order [user=" + user + ", date=" + date + ", price=" + price
                + ", goodsList=" + goodsList.toString() + "]";
    }

}
// 商品類
package cn.com.bean;

package cn.com.bean;

/**
 * Goods.java:商品類
 * @author ypykip
 *
 */
public class Goods {
    private String id;
    private String name;
    private String price;
    private String count;
    private String total_price;

    //省略getter和setter...

    @Override
    public String toString() {
        return "Goods [id=" + id + ", name=" + name + ", price=" + price
                + ", count=" + count + ", total_price=" + total_price +"]";
    }
}

// 解析類
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;

import cn.com.bean.Goods;
import cn.com.bean.Order;

/**
 * title:通過digester的方式來解析Order.xml
 * @author grk
 * 重點:理解棧的概念
 * 當(dāng)使用addObjectCreate()方法時,創(chuàng)建一個對象進棧
 * 以下的所有操作(有一種情況除外,表明調(diào)用的方法)都是對棧頂元素來講的,除非調(diào)用
 * addSetNext()方法,移除棧頂元素并執(zhí)行次棧頂元素的指定方法
 * 
 * addCallMethod(pattern, methodName):調(diào)用棧頂元素的指定方法
 * addCallMethod(pattern, methodName, paramCount):調(diào)用棧頂元素的指定方法,可指定方法的
 * 參數(shù)個數(shù)addCallMethod(pattern, methodName, paramCount, paramTypes):調(diào)用棧頂元素的
 * 指定方法,可指定方法的參數(shù)個數(shù),類型
 * 
 * addCallParam(pattern, paramIndex):默認設(shè)置指定paramIndex參數(shù)為標(biāo)簽內(nèi)容
 * addCallParam(pattern, paramIndex, fromStack):設(shè)置指定paramIndex參數(shù)為棧頂元素
 * addCallParam(pattern, paramIndex, stackIndex):設(shè)置指定paramIndex參數(shù)為?
 * addCallParam(pattern, paramIndex, attributeName):設(shè)置指定paramIndex參數(shù)為標(biāo)簽屬性
 * attributeName的值 addObjectParam(pattern, paramIndex, paramObj):設(shè)置指定paramIndex
 * 參數(shù)為paramObj
 *
 * addSetNext(pattern, methodName):調(diào)用次棧頂元素的methodName方法,一般為有一個參數(shù)的方法,
 * 將棧頂元素作為入?yún)?,如list的add方法
 *  
 */
public class ParseOrder {
    public static void main(String[] args) {
        parseByJavaBean();
    }

    /**
     * 使用javaBean進行存儲
     */
    public static void parseByJavaBean(){
        // 1.初始化Digester實例對象
        Digester digester = new Digester();

        // 2.解析<Order>標(biāo)簽節(jié)點
        //list進棧,棧頂元素的list對象
        digester.addObjectCreate("Orders", ArrayList.class);
        //Order實例進棧,棧頂元素時Order實例對象
        digester.addObjectCreate("Orders/Order", Order.class);
        //設(shè)置<Order>標(biāo)簽的屬性
        digester.addSetProperties("Orders/Order");

        // 3.解析<goods>標(biāo)簽節(jié)點
        //Goods實例對象進棧
        digester.addObjectCreate("Orders/Order/goods", Goods.class);
        digester.addSetProperties("Orders/Order/goods");
        //設(shè)置<goods>下的其他標(biāo)簽內(nèi)容
        digester.addBeanPropertySetter("Orders/Order/goods/name");
        digester.addBeanPropertySetter("Orders/Order/goods/price");
        digester.addBeanPropertySetter("Orders/Order/goods/count");
        digester.addBeanPropertySetter("Orders/Order/goods/total_price");
        //Goods對象實例出棧
        digester.addSetNext("Orders/Order/goods", "add");
        //Order對象實例出棧
        digester.addSetNext("Orders/Order", "add");

        // 4.加載配置文件
        String filePath = "";
        filePath = System.getProperty("user.dir")+"/bin/config/Order.xml";
        File file = new File(filePath);

        // 5.解析
        try {
            ArrayList list = (ArrayList) digester.parse(file);
            System.out.println(list.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果

[Order [user=張三, date=2008-11-14, price=12279, goodsList=[Goods [id=1, name=IBM筆記本, price=8999, count=1, total_price=8999], Goods [id=2, name=雅戈爾西服, price=1300, count=2, total_price=2600]]]]

4.2 通過java編碼方式解析(list和map存儲)

    /**
     * 使用list和map進行存儲(過程復(fù)雜,不建議使用)
     */
    public static void parseByMap(){
        Digester digester = new Digester();
        // 1.定義Orders節(jié)點規(guī)則,創(chuàng)建一個List集合
        digester.addObjectCreate("Orders", ArrayList.class);

        // 2.定義Orders/Order節(jié)點規(guī)則,創(chuàng)建一個Map集合用來存儲屬性和內(nèi)容,并將此Map放在上一節(jié)點中的List
        digester.addObjectCreate("Orders/Order", HashMap.class);
        digester.addSetNext("Orders/Order", "add");

        // 3.定義Orders/Order節(jié)點的屬性
        digester.addCallMethod("Orders/Order", "put", 2);//調(diào)用棧頂元素map的put方法
        digester.addObjectParam("Orders/Order", 0, "name");//設(shè)置key
        digester.addCallParam("Orders/Order", 1, "name");//設(shè)置value
        digester.addCallMethod("Orders/Order", "put", 2);
        digester.addObjectParam("Orders/Order", 0, "date");
        digester.addCallParam("Orders/Order", 1, "date");
        digester.addCallMethod("Orders/Order", "put", 2);
        digester.addObjectParam("Orders/Order", 0, "price");
        digester.addCallParam("Orders/Order", 1, "price");

        // 4.定義一個List集合,用來存儲Orders/Order節(jié)點下的標(biāo)簽
        digester.addCallMethod("Orders/Order", "put", 2);
        digester.addObjectCreate("Orders/Order", ArrayList.class);
        digester.addObjectParam("Orders/Order", 0, "goodsList");
        digester.addCallParam("Orders/Order", 1, true);

        // 5.定義Orders/Order/goods節(jié)點規(guī)則,分別存儲id,name,price,count,total_price屬性或標(biāo)簽
        digester.addObjectCreate("Orders/Order/goods", HashMap.class);
        digester.addSetNext("Orders/Order/goods", "add");
        digester.addCallMethod("Orders/Order/goods", "put", 2);
        digester.addObjectParam("Orders/Order/goods", 0, "id");
        digester.addCallParam("Orders/Order/goods", 1, "id");

        digester.addCallMethod("Orders/Order/goods/name", "put", 2);
        digester.addObjectParam("Orders/Order/goods/name", 0, "name");
        digester.addCallParam("Orders/Order/goods/name", 1);
        digester.addCallMethod("Orders/Order/goods/price", "put", 2);
        digester.addObjectParam("Orders/Order/goods/price", 0, "price");
        digester.addCallParam("Orders/Order/goods/price", 1);
        digester.addCallMethod("Orders/Order/goods/count", "put", 2);
        digester.addObjectParam("Orders/Order/goods/count", 0, "count");
        digester.addCallParam("Orders/Order/goods/count", 1);
        digester.addCallMethod("Orders/Order/goods/total_price", "put", 2);
        digester.addObjectParam("Orders/Order/goods/total_price", 0, "total_price");
        digester.addCallParam("Orders/Order/goods/total_price", 1);

        String filePath = System.getProperty("user.dir")+"/bin/config/Order.xml";
        System.out.println(filePath);
        File file = new File(filePath);
        System.out.println(file.getAbsolutePath());
        try {
            ArrayList list = (ArrayList) digester.parse(file);
            System.out.println(list.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }

4.3 通過xml配置方式解析

4.3.1 OrderConfigRule.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<digester-rules>
    <pattern value="Orders">
        <object-create-rule classname="java.util.ArrayList" />  
        <!-- 配置<Order>標(biāo)簽 -->
        <pattern value="Order">
            <object-create-rule classname="cn.com.bean.Order" />
                <set-properties-rule/>

            <!-- 配置<goods>標(biāo)簽 -->
            <pattern value="goods">
                <object-create-rule classname="cn.com.bean.Goods" />
                <set-properties-rule>
                    <alias attr-name="id" prop-name="id" /><!-- id屬性對應(yīng)javabean的id -->
                </set-properties-rule>
                <bean-property-setter-rule pattern="name" propertyname="name" /><!-- name屬性對應(yīng)javabean的name -->
                <bean-property-setter-rule pattern="price" propertyname="price" /><!-- price標(biāo)簽對應(yīng)javabean的price -->
                <bean-property-setter-rule pattern="count" propertyname="count" /><!-- count標(biāo)簽對應(yīng)javabean的count -->
                <bean-property-setter-rule pattern="total_price" propertyname="total_price" /><!-- total_price標(biāo)簽對應(yīng)javabean的total_price -->
                <set-next-rule methodname="add" paramtype="cn.com.bean.Goods"/>

            </pattern>
            <set-next-rule methodname="add" paramtype="cn.com.bean.Order"/>
        </pattern>
    </pattern>
</digester-rules>  

4.3.2 Java解析

public static void parseByXmlConfig() throws IOException, SAXException, URISyntaxException{
        // 1.加載規(guī)則配置文件
        URL rule = Thread.currentThread()
                .getContextClassLoader()
                .getResource("config/OrderConfigRules.xml");

        // 2.加載待解析的配置文件Order.xml
        Reader reader = null;
        try {
            reader = new InputStreamReader(
                    new FileInputStream(
                            new File(System.getProperty("user.dir") + "/bin/config/Order.xml")), "utf-8");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // 3.根據(jù)規(guī)則配置文件創(chuàng)建Digester實例對象
        InputSource in = new InputSource(new InputStreamReader(new FileInputStream(new File(rule.toURI()))));
        Digester digester = DigesterLoader.createDigester(in);

        // 4.進行解析并打印結(jié)果
        List list = (List) digester.parse(reader);
        System.out.println(list.toString());
        try {
            if(reader != null){
                reader.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

結(jié)果

[Order [user=張三, date=2008-11-14, price=12279, goodsList=[Goods [id=1, name=IBM筆記本, price=8999, count=1, total_price=8999], Goods [id=2, name=雅戈爾西服, price=1300, count=2, total_price=2600]]]]

5.總結(jié)

如果需要調(diào)用addSetNext()方法時,addObjectCreate()方法和addSetNext()方法最好成對出現(xiàn)

首先要知道addSetNext()方法是調(diào)用次棧頂元素的方法,一般以棧頂元素為參數(shù)。如上例中使用list和map的方式進行存儲時,創(chuàng)建順序分別是Orders—>Order—>goods,對應(yīng)的list和map分別是list(Orders)—>map(Order)—>list(goodsList)—>map(goods)。當(dāng)遇到Orders/Order節(jié)點時,分別創(chuàng)建了一個map和一個list,分別表示訂單和商品集合。當(dāng)遇到 < /order> 結(jié)束標(biāo)簽時需要調(diào)用list(Orders)的add()方法,即需要此時的棧頂元素是map(Order)和次棧頂元素是list(Orders)。如果addSetNext()寫在了list(goodsList)創(chuàng)建之后,此時的棧頂元素和次棧頂元素分別是list(goodsList),map(Order),而map是沒有add方法的,所以會報錯:

java.lang.NoSuchMethodException: No such accessible method: add() on object: java.util.HashMap

通過使用java編碼和配置規(guī)則兩種方式都可以實現(xiàn)解析,其實兩者看上去十分相似熟練了其中一種,另一種也就無師自通

以上就是使用Digester解析XML文件的三種方式小結(jié)的詳細內(nèi)容,更多關(guān)于Digester解析XML文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺析Java中的異常處理機制

    淺析Java中的異常處理機制

    這篇文章主要介紹了Java中的異常處理機制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • 詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用

    詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用

    這篇文章主要介紹了詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • java實現(xiàn)在SSM下使用支付寶掃碼支付功能

    java實現(xiàn)在SSM下使用支付寶掃碼支付功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)在SSM下使用支付寶掃碼支付功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java計算時間差和日期差五種常用示例

    Java計算時間差和日期差五種常用示例

    這篇文章主要給大家介紹了關(guān)于Java計算時間差和日期差五種常用示例的相關(guān)資料,最近工作中遇到需要計算時間差和日期差,搜索了幾種計算時間差和日期差的方法,這里總結(jié)一下,需要的朋友可以參考下
    2023-08-08
  • spring security自定義決策管理器

    spring security自定義決策管理器

    這篇文章主要介紹了spring security自定義決策管理器的實現(xiàn)代碼,需要的朋友參考下吧
    2017-09-09
  • Java中使用OKHTTP3的詳細教程與實戰(zhàn)應(yīng)用案例

    Java中使用OKHTTP3的詳細教程與實戰(zhàn)應(yīng)用案例

    okhttp是當(dāng)下主流的網(wǎng)絡(luò)請求的開源框架,效率很高,使用起來也非常方便,這篇文章主要介紹了Java中使用OKHTTP3的詳細教程與實戰(zhàn)應(yīng)用案例的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-01-01
  • IDEA實現(xiàn) springmvc的簡單注冊登錄功能的示例代碼

    IDEA實現(xiàn) springmvc的簡單注冊登錄功能的示例代碼

    這篇文章主要介紹了IDEA實現(xiàn) springmvc的簡單注冊登錄功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java?@Scheduled定時任務(wù)不執(zhí)行解決辦法

    Java?@Scheduled定時任務(wù)不執(zhí)行解決辦法

    這篇文章主要給大家介紹了關(guān)于Java?@Scheduled定時任務(wù)不執(zhí)行解決的相關(guān)資料,當(dāng)@Scheduled定時任務(wù)不執(zhí)行時可以根據(jù)以下步驟進行排查和解決,需要的朋友可以參考下
    2023-10-10
  • Mybatis中 XML配置詳解

    Mybatis中 XML配置詳解

    這篇文章主要介紹了Mybatis中 XML配置詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • Java構(gòu)造方法實例詳解(動力節(jié)點java學(xué)院整理)

    Java構(gòu)造方法實例詳解(動力節(jié)點java學(xué)院整理)

    其實java構(gòu)造方法很簡單,下面通過示例給大家分享java構(gòu)造方法,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2017-04-04

最新評論

商洛市| 山西省| 正宁县| 开化县| 碌曲县| 碌曲县| 阳朔县| 翼城县| 探索| 嘉兴市| 湘阴县| 永康市| 营口市| 恭城| 哈巴河县| 东城区| 潼南县| 阿合奇县| 西吉县| 安福县| 淳化县| 芒康县| 平遥县| 安化县| 稷山县| 固始县| 剑川县| 鄂伦春自治旗| 重庆市| 磐安县| 本溪市| 龙门县| 同德县| 尉犁县| 常德市| 明溪县| 闽侯县| 文化| 寻乌县| 曲水县| 淅川县|