`
xiehongdong
  • 浏览: 68630 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Digester解析xml到bean

阅读更多

假设有下列xml文件:

<?xml version='1.0' encoding='utf-8'?>
<address-book>
    <contact myType="individual">
        <name>Zane Pasolini</name>
        <address>999 W. Prince St.</address>
        <city>New York</city>
        <province>NY</province>
        <postalcode>10013</postalcode>
        <country>USA</country>
        <telephone>1-212-345-6789</telephone>
    </contact>
    <contact myType="business">
        <name>SAMOFIX d.o.o.</name>
        <address>Ilica 47-2</address>
        <city>Zagreb</city>
        <province></province>
        <postalcode>10000</postalcode>
        <country from="cn">Croatia</country>
        <telephone>385-1-123-4567</telephone>
    </contact>
</address-book>

 

这是一份常用到的文件,现在我们需要将之映射到java bean,用Digester解析显得非常简单 

public class AddressBookParser
{
    /**
     * Prints the contact information to standard output.
     *
     * @param contact the <code>Contact</code> to print out
     */
    public void addContact(Contact contact)
    {
        System.out.println("TYPE: " + contact.getType());
        System.out.println("NAME: " + contact.getName());
        System.out.println("    ADDRESS:    " + contact.getAddress());
        System.out.println("    CITY:       " + contact.getCity());
        System.out.println("    PROVINCE:   " + contact.getProvince());
        System.out.println("    POSTALCODE: " + contact.getPostalcode());
        System.out.println("    COUNTRY:    " + contact.getCountry());
        System.out.println("    COUNTRY-From:    " + contact.getCountryFrom());
        System.out.println("    TELEPHONE:  " + contact.getTelephone());
    }

    /**
     * Configures Digester rules and actions, parses the XML file specified
     * as the first argument.
     *
     * @param args command line arguments
     */
    public static void main(String[] args) throws IOException, SAXException
    {
        // instantiate Digester and disable XML validation
        Digester digester = new Digester();
        digester.setValidating(false);

        // instantiate AddressBookParser class
        digester.addObjectCreate("address-book", AddressBookParser.class );
        // instantiate Contact class
        digester.addObjectCreate("address-book/contact", Contact.class );

        // set type property of Contact instance when 'type' attribute is found
        //对有属性的值通过setProperties方法

        digester.addSetProperties("address-book/contact",         "myType", "type" );

        // set different properties of Contact instance using specified methods
        //addCallMethod与addBeanPropertySetter等价
        // 参数 0代表一个参数,默认就是当前读的数据

        digester.addCallMethod("address-book/contact/name",       "setName", 0);
        digester.addCallMethod("address-book/contact/address",    "setAddress", 0);
        digester.addCallMethod("address-book/contact/address",    "setAddress",0);
        digester.addCallMethod("address-book/contact/city",       "setCity", 0);
        digester.addCallMethod("address-book/contact/province",   "setProvince", 0);
        digester.addCallMethod("address-book/contact/postalcode", "setPostalcode", 0);
        digester.addCallMethod("address-book/contact/country",    "setCountry", 0);



        //增加country的属性 : from
        digester.addSetProperties("address-book/contact/country","from","countryFrom");
        digester.addCallMethod("address-book/contact/telephone",  "setTelephone", 0);

        // call 'addContact' method when the next 'address-book/contact' pattern is seen
        digester.addSetNext("address-book/contact",               "addContact" );

        // now that rules and actions are configured, start the parsing process
        AddressBookParser abp = (AddressBookParser) digester.parse(new File("c:\\addressbook.xml"));
    }

    /**
     * JavaBean class that holds properties of each Contact entry.
     * It is important that this class be public and static, in order for
     * Digester to be able to instantiate it.
     */
    public static class Contact
    {
        private String type;
        private String name;
        private String address;
        private String city;
        private String province;
        private String postalcode;
        private String country;
        //增加一个country的属性: from
        private String countryFrom;
        private String telephone;

        public void setType(String newType)
        {
            type = newType;
        }
        public String getType()
        {
            return type;
        }

        public void setName(String newName)
        {
            name = newName;
        }
        public String getName()
        {
            return name;
        }

        public void setAddress(String newAddress)
        {
            address = newAddress;
        }
        public String getAddress()
        {
            return address;
        }

        public void setCity(String newCity)
        {
            city = newCity;
        }
        public String getCity()
        {
            return city;
        }

        public void setProvince(String newProvince)
        {
            province = newProvince;
        }
        public String getProvince()
        {
            return province;
        }

        public void setPostalcode(String newPostalcode)
        {
            postalcode = newPostalcode;
        }
        public String getPostalcode()
        {
            return postalcode;
        }

        public void setCountry(String newCountry)
        {
            country = newCountry;
        }
        public String getCountry()
        {
            return country;
        }

        public void setTelephone(String newTelephone)
        {
            telephone = newTelephone;
        }
        public String getTelephone()
        {
            return telephone;
        }

        public String getCountryFrom() {
            return countryFrom;
        }

        public void setCountryFrom(String countryFrom) {
            this.countryFrom = countryFrom;
        }
    }
}

 

 

AjaxChat 中的读取房间信息的方式显得更简洁
房间的xml配置文件如下:
 

<rooms>
  <room id="1" name="General Topics" />
  <room id="2" name="Programming" />
  <room id="3" name="Movies" />
  <room id="4" name="Music" />
  <room id="5" name="Television" />
</rooms>

 

解析代码如下 :

public synchronized void init(InputStream isConfigFile) {

        log.debug("init()");
        if (isConfigFile != null) {
            // Read in rooms config and create beans, hand off to DAO.
            Digester digester = new Digester();
            digester.setValidating(false);
            digester.push(this);
            digester.addObjectCreate("rooms/room",
                    "org.apache.struts.apps.ajaxchat.dto.RoomDTO");
            //注意这里,如果xl的属性名称和bean的属性名称完全对应,则直接提供xml的位置即可
            digester.addSetProperties("rooms/room");
            digester.addSetNext("rooms/room", "addRoom");
            try {
                digester.parse(isConfigFile);
                log.info("***** Rooms = " + rooms);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (SAXException se) {
                se.printStackTrace();
            }
        }

    } // End init().

 

如果在xml文件中增加非attribute则更改后的配置文件如下:

<rooms>
  <room id="1" name="General Topics" />
  <room id="2" name="Programming" />
  <room id="3" name="Movies" />
  <room id="4" name="Music" />
  <room id="5" name="Television" />
  <room>
    <id>6</id>
    <name>shit</name>
  </room>
  <room>
    <id>7</id>
    <name>haha</name>
  </room>
</rooms>

 对应的解析如下:

public synchronized void init(InputStream isConfigFile) {

        log.debug("init()");
        if (isConfigFile != null) {
            // Read in rooms config and create beans, hand off to DAO.
            Digester digester = new Digester();
            digester.setValidating(false);
            digester.push(this);
            digester.addObjectCreate("rooms/room",
                    "org.apache.struts.apps.ajaxchat.dto.RoomDTO");
            digester.addSetProperties("rooms/room");
            //增加addCallMethod方法
            digester.addCallMethod("rooms/room/id","setId",0);
            digester.addCallMethod("rooms/room/name","setName",0);
            digester.addSetNext("rooms/room", "addRoom");
            try {
                digester.parse(isConfigFile);
                log.info("***** Rooms = " + rooms);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (SAXException se) {
                se.printStackTrace();
            }
        }

    } // End init().

 本文转自http://www.blogjava.net/alex/archive/2006/09/06/68148.html

分享到:
评论

相关推荐

    digester 解析xml

    **使用Digester解析XML并验证** 1. **设置 Digester 规则** 在使用Digester之前,我们需要定义一系列规则,告诉Digester在遇到XML文档的哪些元素时执行什么操作。这些规则通常涉及到创建新对象、设置对象属性或者...

    利用digester来将xml转换为bean

    4. **解析XML**:最后,使用Digester的`parse`方法解析XML文档,并获取Java Bean实例: ```java File xmlFile = new File("path_to_your_xml_file.xml"); Book book = (Book) digester.parse(xmlFile); ``` 5. ...

    利用Digester把XML转换成为Java对象

    4. **解析XML文件**:最后,通过调用`digester.parse()`方法来解析XML文件,并将解析结果填充到Java对象中。 #### 示例代码 以下是一个简化的`deregister`方法示例,展示了如何使用Digester从XML文件中读取图表...

    digester包

    使用digester解析XML时,我们需要遵循以下步骤: 1. **初始化Digester**:创建一个Digester实例,并设置必要的属性,如命名空间处理、错误处理等。 2. **定义Rule**:创建Rule对象,这些对象定义了当XML文档中的...

    xml解析在java中的应用小程序

    DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,便于遍历和操作。这种方式适合小规模的XML文档,但对大文件可能会消耗大量内存。SAX解析器则采用事件驱动模型,只在遇到XML元素时触发相应事件,按需处理...

    Apache xml转换java对象 Digester

    // 解析XML文件 digester.parse("data.xml"); } } ``` 通过以上步骤,我们成功地将XML数据转换为了Java对象,并实现了规则集的外部化管理。 #### 四、总结 通过本篇文章的介绍,我们了解了如何使用`Apache ...

    digester 实例

    - `EISMessage.java`, `NetworkCard.java`, `OperatingSystem.java`, `LogicalDrive.java`可能是用户自定义的Java类,它们可能是被digester解析的XML配置文件所创建和配置的对象。 在实际应用中,`digester`通常会...

    浅析Digester

    在Java开发中,我们经常需要处理XML文件,解析XML并将其内容映射到相应的Java对象上。这时,Apache Commons Digester库就派上了用场。本文将深入探讨Digester的功能、工作原理以及如何在实际项目中应用。 **一、...

    digester(浅谈第一次使用)

    标题中的“digester”指的是Apache Commons Digester,它是一个Java库,主要用于解析XML文档并根据预定义的规则创建和配置Java对象。这个工具在处理XML到Java对象映射时非常有用,尤其在需要大量重复性操作的情况下...

    commons-digester.jar下载

    Commons-Digester是一个Java库,它提供了一组规则来解析XML文档,并将解析结果映射到Java对象。这个库在处理XML配置文件时特别有用,因为它可以自动化将XML元素和属性转换为对象的属性和方法调用。在给定的标题...

    digester jar包大全

    当解析XML时, Digester会自动调用相应的Java方法,从而简化了原本繁琐的手动解析过程。这一特性使得Digester尤其适用于构建配置驱动的应用程序,如Web应用、服务器插件等。 首先,我们需要理解Digester的工作原理...

    commons-digester-2.0-bin

    在实际应用中,Commons Digester常用于配置文件的解析,例如在Spring框架中,它被用来解析XML配置文件,创建和配置bean。此外,它也适用于任何需要根据XML结构动态生成和操作Java对象的场景。 总的来说,Commons ...

    aspectjrt、aspectjweaver、commons-beanutils、commons-digester

    使用Digester可以减少手动解析XML的繁琐工作,使代码更加简洁和可维护。 这些库在Java开发中的应用广泛,例如在企业级应用开发中,AspectJ可以用于日志记录、性能监控和事务管理等,而Commons BeanUtils和Commons ...

    java xml realworld problem

    - Apache Commons Digester简化了基于规则的XML解析。 总之,Java与XML的结合在实际开发中扮演着重要角色,从数据交换、配置管理到网络通信,XML都是不可或缺的一部分。理解并熟练运用各种XML处理技术,能有效提升...

    xml与javabean的相互转换

    4. XMLBeans库:压缩包中的"xmlbean"可能指的是Apache的XMLBeans项目,这是一个强大的库,能够直接将XML Schema编译成Java类,这些类可以直接用来序列化和反序列化XML。XMLBeans通过使用Schema信息来生成高度优化的...

    xbean,xmlpublic,xml-apis等jar

    XBean通过Apache Commons Digester和Xerces来解析XML配置文件,并将其转换为Java对象。这个框架主要用于简化复杂配置文件的处理,尤其是在Spring框架中,XBean可以作为一个扩展,帮助处理XML配置文件。它支持动态...

    java_xml_api.rar_xml文档分析

    在实际开发中,为了方便和高效地操作XML,通常会使用如JAXB(Java Architecture for XML Binding)这样的工具,它允许将XML文档直接绑定到Java对象,简化了数据的序列化和反序列化过程。此外,Apache的 Commons ...

    Websiteconfig

    - **commons-digester-2.1.jar**:Apache Commons Digester是一个处理XML文档的工具,通过定义规则链,可以在解析XML时自动创建和配置Java对象,非常适合于从XML配置文件中构建对象模型。 - **commons-logging-...

    commons jar包

    这在处理XML配置文件时特别有用,可以避免手动解析XML并构建相应的Java对象。开发者可以定义一系列匹配模式,当解析到特定的XML结构时,Digester会执行相应的Java方法或创建新的对象。这种映射规则可以极大地减少...

Global site tag (gtag.js) - Google Analytics