• Digester


    1. 介绍

    这是一个apache 用于解析XML的工具类,这里依赖到的包有以下几个

    • commons-digester3-3.2.jar
    • cglib-2.2.2.jar
    • asm-3.3.1.jar
    • commons-beanutils-1.8.3.jar
    • commons-logging-1.1.1.jar

    2.案例说明

    下面就用一个实际的几个类来说明他的用法

    测试类

    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.digester3.Digester;
    import org.xml.sax.SAXException;
    
    import com.io.test.apache.digester.model.DigesterRule;
    import com.io.test.apache.digester.model.School;
    import com.io.test.apache.digester.model.SchoolClass;
    
    public class DigesterTest {
    
        public static void main(String[] args) {
            //创建一个Digester
            Digester d = new Digester();
            
            //添加规则组
            d.addRuleSet(new DigesterRule());
            try {
                //开始解析xml文件,这列就是按照上面所设的规则组合来决定如何解析这个xml
                School school = (School)d.parse(new File("./src/com/io/test/apache/digester/test.xml"));
                System.out.println(school.getName());
                
                for(SchoolClass sc : school.getSchoolClasses()){
                    System.out.println(sc.getClassName());
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    规则组-1

    import org.apache.commons.digester3.CallMethodRule;
    import org.apache.commons.digester3.Digester;
    import org.apache.commons.digester3.ObjectCreateRule;
    import org.apache.commons.digester3.Rule;
    import org.apache.commons.digester3.RuleSetBase;
    import org.apache.commons.digester3.SetNestedPropertiesRule;
    import org.apache.commons.digester3.SetNextRule;
    
    public class DigesterRule extends RuleSetBase {
    
        @Override
        public void addRuleInstances(Digester arg0) {
            //遇到shcool节点的时候,创建一个School对象
            arg0.addRule("school", new ObjectCreateRule(School.class));
            
            //遇到school/detail节点的时候,把子节点的内容存放在顶层对象(School)对象当中
            arg0.addRule("school/detail", createSetNestedPropertiesRule());
            
            //添加新的规则组,这里对应的是规则组-2
            arg0.addRuleSet(new ClassRule());
            
            //遇到school/classes/class节点的时候,执行addClass的时候方法,并且以上一个创建的对象作为参数传递,
            arg0.addRule("school/classes/class", new SetNextRule("addClass"));
        }
    
        /**
         * 在该指定路径下的所有节点,都会被设置到最顶端的对象当中
         * @return
         */
        public Rule createSetNestedPropertiesRule() {
            SetNestedPropertiesRule rule = new SetNestedPropertiesRule();
            rule.setAllowUnknownChildElements(true);
            return rule;
        }
    
        /**
         * 调用方法规则
         * 指定路径下的节点获取到的值,会通过调用指定方法,执行,默认参数为String
         * @param methodName
         * @param paramCount
         * @return
         */
        public Rule createCallMethodRule(String methodName, int paramCount) {
            return new CallMethodRule(methodName, paramCount);
        }
    }

    规则组-2

    import org.apache.commons.digester3.Digester;
    import org.apache.commons.digester3.ObjectCreateRule;
    import org.apache.commons.digester3.RuleSetBase;
    import org.apache.commons.digester3.SetNestedPropertiesRule;
    
    public class ClassRule extends RuleSetBase {
    
        @Override
        public void addRuleInstances(Digester arg0) {
            //遇到school/classes/class节点的时候,创建一个schoolClass对象
            arg0.addRule("school/classes/class", new ObjectCreateRule(SchoolClass.class));
            
            //遇到school/classes/class节点的时候,把所有子节点的内容存放在顶层对象(schoolClass)的属性当中
            arg0.addRule("school/classes/class", new SetNestedPropertiesRule());
    
        }
    
    }

    其它模型类

    学校模型

    public class School {
    
        private String name;
        private String address;
        private List<SchoolClass> schoolClasses;
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void addClass(SchoolClass schoolClass){
            if(schoolClasses == null){
                schoolClasses = new ArrayList<SchoolClass>();
            }
            this.schoolClasses.add(schoolClass);
        }
        
        public List<SchoolClass> getSchoolClasses() {
            return schoolClasses;
        }
    }

    班级模型

    public class SchoolClass {
    
        private String className;
    
        private List<Student> students;
    
        public SchoolClass() {
            students = new ArrayList<Student>();
        }
    
        public String getClassName() {
            return className;
        }
    
        public void setClassName(String className) {
            this.className = className;
        }
    
        public List<Student> getStudents() {
            return students;
        }
    
        public void setStudents(List<Student> students) {
            this.students = students;
        }
    }

    XML文件

    <?xml version="1.0" encoding="utf-8" ?>
    <school>
        <detail>
            <name>学校-1</name>
            <address>北京</address>
        </detail>
        <classes>
            <class>
                <className>class-1</className>
            </class>
        </classes>
        
        
    </school>
  • 相关阅读:
    如何修改SVN中的用户名和密码
    Telerik_2012_Q3 RadGrid 汉化
    DXperience-12.1.5 官网下载+注册破解+帮助文档
    Telerik_2012_Q3 (已破解)全套下载链接
    WinForm 控件库
    向项目的文件夹中写入数据流
    coolcarousel 图片轮播缩放问题
    IOS开发UI篇--使用CAShapeLayer实现复杂的View的遮罩效果
    iOS开发
    解析 iOS 动画原理与实现
  • 原文地址:https://www.cnblogs.com/oscar1987121/p/10882841.html
Copyright © 2020-2023  润新知