java之xml进阶教程——使用castor框架

0.新的技术,新的框架,这些都值得你去学习,而不是重复造轮子!

xml与类对应起来,类与mapping对应起来。使用castor框架解析,而不是新手教程的for遍历和equals。

1.xml文本_conf.xml

展示两种,一种是属性,一种是元素

<?xml version="1.0" encoding="UTF-8"?>
<!--我是注释!包含ommbFtp和数据库模块-->
<module>
    <ommbFtp ip="10" port="21" userName="aaa" passWord="bbb" />

    <oracleDb>
        <ip>10</ip>
        <port>1521</port>
        <userName>system</userName>
        <passWord>nihao</passWord>
        <instance>oracle</instance>
    </oracleDb>

</module>

2.创建与xml对应的类

2.1 根元素Module 类

package paseXml;

public class Module {

    private OmmbFtp ommbFtp;
    private OracleDb oracleDb;

    public OmmbFtp getOmmbFtp() {
        return ommbFtp;
    }
    public void setOmmbFtp(OmmbFtp ommbFtp) {
        this.ommbFtp = ommbFtp;
    }
    public OracleDb getOracleDb() {
        return oracleDb;
    }
    public void setOracleDb(OracleDb oracleDb) {
        this.oracleDb = oracleDb;
    }
}

2.2 OmmbFtp 类——属性

package paseXml;

public class OmmbFtp {

    private String  ip; 
    private int  port; 
    private String  userName; 
    private String  passWord;

    public OmmbFtp(){}

    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    } 
}

2.3 OracleDb 类——元素

package paseXml;

public class OracleDb {

    private String  ip; 
    private String  port; 
    private String  userName; 
    private String  passWord;
    private String  instance;

    public OracleDb(){}
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getPort() {
        return port;
    }
    public void setPort(String port) {
        this.port = port;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    public String getInstance() {
        return instance;
    }
    public void setInstance(String instance) {
        this.instance = instance;
    }
}

3.创建与类对应的mapping.xml

element代表元素; attribute代表属性

这里可以直接设置读取int,只要你的对应代码中写成int,就可以成功读取

这里可能会因为大小写什么的出问题,耐心点啦,一点一点检查。

<?xml version="1.0" encoding="UTF-8"?>

<mapping>

    <!-- 类paseXml.Module映射 
    element代表元素;
    attribute代表属性
    -->
    <class name="paseXml.Module">
        <!--用 map-to 元素和 xml 属性指定这个类要映射到的 XML 元素 -->
        <map-to xml="module" />

         <field name="ommbFtp" type="paseXml.OmmbFtp">  
            <bind-xml name="ommbFtp" node="element"/>
         </field>

         <field name="oracleDb" type="paseXml.OracleDb">  
            <bind-xml name="oracleDb" node="element"/>
         </field>
    </class>

    <!-- 类paseXml.OmmbFtp映射 -->
    <class name="paseXml.OmmbFtp">
        <!--用 map-to 元素和 xml 属性指定这个类要映射到的 XML 元素 -->
        <map-to xml="ommbFtp" />

         <field name="ip" type="java.lang.String">  
            <bind-xml name="ip" node="attribute"/>  
         </field>

         <field name="port" type="int">  
            <bind-xml name="port" node="attribute"/>  
         </field>

         <field name="userName" type="java.lang.String">  
            <bind-xml name="userName" node="attribute"/>  
         </field>

         <field name="passWord" type="java.lang.String">  
            <bind-xml name="passWord" node="attribute"/>  
         </field>
    </class>

    <!-- 类paseXml.OmmbFtp映射 -->
    <class name="paseXml.OracleDb">
        <!--用 map-to 元素和 xml 属性指定这个类要映射到的 XML 元素 -->
        <map-to xml="oracleDb" />

         <field name="ip" type="java.lang.String">  
            <bind-xml name="ip" node="element"/>  
         </field>

         <field name="port" type="java.lang.String">  
            <bind-xml name="port" node="element"/>  
         </field>

         <field name="userName" type="java.lang.String">  
            <bind-xml name="userName" node="element"/>  
         </field>

         <field name="passWord" type="java.lang.String">  
            <bind-xml name="passWord" node="element"/>  
         </field>

         <field name="instance" type="java.lang.String">  
            <bind-xml name="instance" node="element"/>  
         </field>
    </class>
</mapping>

4.开始测试

需要的包:

castor-1.3-core.jar
castor-1.3-xml.jar
castor-1.3.jar

package paseXml;

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import org.apache.log4j.Logger;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.xml.Unmarshaller;


public class ModuleParsor {

    private static Logger log = Logger.getLogger(ModuleParsor.class);
    private static Module module;
    private static ModuleParsor instance = new ModuleParsor();

    public static ModuleParsor getInstance()
    {
        return instance;
    }

    public ModuleParsor(){
//      获取两个xml文件的路径
        String dir = System.getProperty("user.dir");
         String mappingPath = dir + "/conf/mapping.xml";
         String ommbNODataPath = dir + "/conf/conf.xml";
         Mapping mapping = new Mapping();

         try
         {
             mapping.loadMapping(mappingPath);
             Reader xmlreader = new InputStreamReader(new FileInputStream(ommbNODataPath), "utf-8");
             //FileReader xmlreader = new FileReader(ommbNODataPath);
             Unmarshaller unmarshaller = new Unmarshaller(Module.class);
             unmarshaller.setMapping(mapping);
             module = (Module) unmarshaller.unmarshal(xmlreader);
         }
         catch (Exception e)
         {
             log.error("ooo,发生了异常",e);
         }
    }

    public Module getModule(){
        return module;
    }

    public static void main(String[] args) {
        ModuleParsor moduleParsor  = getInstance();
        Module module = moduleParsor.getModule();
        log.info(module.getOmmbFtp().getIp());
        log.info(module.getOmmbFtp().getPassWord());
        log.info(module.getOmmbFtp().getPort());
        int i = module.getOmmbFtp().getPort();
        System.out.println(i);
        String string = module.getOracleDb().getIp();
        System.out.println(string);
        log.info(module.getOracleDb().getInstance());
    }
}

结果如下:

2018-08-24 10:26:08-368 INFO org.exolab.castor.mapping.Mapping.setBaseURL(Mapping.java:198) - D:\workspace_for_luna\BugAnalyseTool/conf is not a URL, trying to convert it to a file URL
2018-08-24 10:26:08-374 INFO org.exolab.castor.mapping.Mapping.loadMapping(Mapping.java:243) - Loading mapping descriptors from ommbNODataMapping.xml
2018-08-24 10:26:08-670 INFO paseXml.ModuleParsor.main(ModuleParsor.java:52) - 10
2018-08-24 10:26:08-670 INFO paseXml.ModuleParsor.main(ModuleParsor.java:53) - bbb
2018-08-24 10:26:08-670 INFO paseXml.ModuleParsor.main(ModuleParsor.java:54) - 21
21
10
2018-08-24 10:26:08-671 INFO paseXml.ModuleParsor.main(ModuleParsor.java:59) - oracle

猜你喜欢

转载自blog.csdn.net/qq_29778641/article/details/81980626