通过JAXB把XML文件转成JavaBean

来源:互联网 发布:城满财富 理财知 编辑:程序博客网 时间:2024/06/05 15:40

1. Jaxb简介

Jaxb是JDK自带的解析XML的利器,详情可参考https://jaxb.java.net/tutorial/

2. 例子

@XmlRootElementpublic class Command {    private String cmd;    private int screenLevel;        private int psgContextLevel;    private List<Rule> rules = new ArrayList<Rule>();    @XmlElement    public String getCmd() {        return cmd;    }    public void setCmd(String cmd) {        this.cmd = cmd;    }    @XmlElement    public int getScreenLevel() {        return screenLevel;    }    public void setScreenLevel(int screenLevel) {        this.screenLevel = screenLevel;    }        @XmlElement    public int getPsgContextLevel() {        return psgContextLevel;    }    public void setPsgContextLevel(int psgContextLevel) {        this.psgContextLevel = psgContextLevel;    }    @XmlElement    public List<Rule> getRules() {        return rules;    }    public void setRules(List<Rule> rules) {        this.rules = rules;    }}
@XmlRootElementpublic class ParamKey {    private String groupIndex;    private String key;    @XmlElement    public String getGroupIndex() {        return groupIndex;    }    public void setGroupIndex(String groupIndex) {        this.groupIndex = groupIndex;    }    @XmlElement    public String getKey() {        return key;    }    public void setKey(String key) {        this.key = key;    }}

@XmlRootElementpublic class Rule {    private String regex;    private List<ParamKey> paramKeys = new ArrayList<ParamKey>();    private String routingInfo;    private Pattern regex_pattern;    @XmlElement    public String getRegex() {        return regex;    }    public void setRegex(String regex) {        this.regex_pattern = Pattern.compile(regex.trim());        this.regex = regex;    }    @XmlElement    public List<ParamKey> getParamKeys() {        return paramKeys;    }    public void setParamKeys(List<ParamKey> paramKeys) {        this.paramKeys = paramKeys;    }    @XmlElement    public String getRoutingInfo() {        return routingInfo;    }    public void setRoutingInfo(String routingInfo) {        this.routingInfo = routingInfo;    }    @XmlTransient    public Pattern getRegex_pattern() {        return regex_pattern;    }    public void setRegex_pattern(Pattern regex_pattern) {        this.regex_pattern = regex_pattern;    }}

对应的XML:
<?xml version="1.0" encoding="UTF-8"?><command>  <cmd>FT</cmd>  <screenLevel>2</screenLevel>  <rules>    <!-- cancel the FT -->    <!-- match the right format and wrong format,such as FT: -,FT: -abc -->    <rule>      <regex>^FT\s*:?\s*-\s*(\S*)?$</regex>      <paramKeys>        <!-- if otherInfo is not null, the command is wrong -->        <paramKey>          <groupIndex>1</groupIndex>          <key>other</key>        </paramKey>      </paramKeys>      <routingInfo>cancelFt</routingInfo>    </rule>    <!-- set the FT -->    <rule>      <!-- FT:airlineCodefltNofltNoSuffix/fltDate/city FT:CA123T/21JAN14/PEK,FT:CA123,FT:CA123/+ -->      <regex>^FT\s*:?\s*(\w{2})?(\d{3,4})([A-Z])?(/([.+-]|\d{1,2}[A-Z]{3}(\d{2})?))?(/(.*))?$      </regex>      <paramKeys>        <paramKey>          <groupIndex>1</groupIndex>          <key>airlineCode</key>        </paramKey>        <paramKey>          <groupIndex>2</groupIndex>          <key>fltNo</key>        </paramKey>        <paramKey>          <groupIndex>3</groupIndex>          <key>fltNoSuffix</key>        </paramKey>        <paramKey>          <groupIndex>5</groupIndex>          <key>fltDate</key>        </paramKey>        <paramKey>          <groupIndex>8</groupIndex>          <key>depStationCode</key>        </paramKey>      </paramKeys>      <routingInfo>setFt</routingInfo>    </rule>    <!-- show the ft -->    <rule>      <regex>^FT\s*:?\s*(.*)?$</regex>      <paramKeys>        <paramKey>          <groupIndex>1</groupIndex>          <key>fltInfo</key>        </paramKey>      </paramKeys>      <routingInfo>showFt</routingInfo>    </rule>  </rules></command>

解析程序为:
public class Xml2Object {public static void main(String[] args) {File file = new File("D:/WorkSpace_DEP/Test/src/resources/ft.xml");Command cmd = parseXml2Object(file);System.out.println(cmd.getCmd());}public static Command parseXml2Object(File f) {Command cmd = null;try {JAXBContext jaxbContext = JAXBContext.newInstance(Command.class);Unmarshaller jaxbUnMarshaller = jaxbContext.createUnmarshaller();cmd = (Command) jaxbUnMarshaller.unmarshal(f);return cmd;} catch (JAXBException e) {e.printStackTrace();}return cmd;}}

其中的一个要点是:XML中的element必须与对应的JavaBeans类名相同,比如Command标签对应Command类,否则解析报错。如果名字不同,也可以通过注解映射。
下面的这个例子是XML中的元素和Java类名不一致的例子。
<?xml version="1.0" encoding="UTF-8"?><command xmlns="http://www.travelsky.com/command"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  <cmd>FT</cmd>  <screenLevel>2</screenLevel>  <rules>    <rule>      <regex>^FT\s*:?\s*-\s*(\S*)?$</regex>      <paramKeys>        <paramKey>          <groupIndex>1</groupIndex>          <key>other</key>        </paramKey>      </paramKeys>      <routingInfo>cancelFt</routingInfo>    </rule>    <rule>      <regex>^FT\s*:?\s*(\w{2})?(\d{3,4})([A-Z])?(/([.+-]|\d{1,2}[A-Z]{3}(\d{2})?))?(/(.*))?$      </regex>      <paramKeys>        <paramKey>          <groupIndex>1</groupIndex>          <key>airlineCode</key>        </paramKey>        <paramKey>          <groupIndex>2</groupIndex>          <key>fltNo</key>        </paramKey>        <paramKey>          <groupIndex>3</groupIndex>          <key>fltNoSuffix</key>        </paramKey>        <paramKey>          <groupIndex>5</groupIndex>          <key>fltDate</key>        </paramKey>        <paramKey>          <groupIndex>8</groupIndex>          <key>depStationCode</key>        </paramKey>      </paramKeys>      <routingInfo>setFt</routingInfo>    </rule>        <rule>      <regex>^FT\s*:?\s*(.*)?$</regex>      <paramKeys>        <paramKey>          <groupIndex>1</groupIndex>          <key>fltInfo</key>        </paramKey>      </paramKeys>      <routingInfo>showFt</routingInfo>    </rule>  </rules></command>

对应的JavaBean
@XmlRootElement(name="command", namespace="http://www.travelsky.com/command")public class CommandEntity {    /**     * cmd:指令名称     *      */    private String cmd;    /**     * screenLevel:指令级别     *      */    private int screenLevel;        /**     * psgContextLevel:读取旅客缓存的级�?     *      */    private int psgContextLevel;    /**     * rules:指令解析规则     *      */    private List<RuleEntity> rules = new ArrayList<RuleEntity>();    @XmlElement(name="cmd",namespace="http://www.travelsky.com/command")    public String getCmd() {        return cmd;    }    public void setCmd(String cmd) {        this.cmd = cmd;    }        @XmlElement(name="screenLevel", namespace="http://www.travelsky.com/command")    public int getScreenLevel() {        return screenLevel;    }    public void setScreenLevel(int screenLevel) {        this.screenLevel = screenLevel;    }        @XmlElement(name="psgContextLevel",namespace="http://www.travelsky.com/command")    public int getPsgContextLevel() {        return psgContextLevel;    }    public void setPsgContextLevel(int psgContextLevel) {        this.psgContextLevel = psgContextLevel;    }    // 注意:对于数组的形式,一定要增加一个注解<span style="font-family: Arial, Helvetica, sans-serif;">XmlElementWrapper,否则xml无法正确解析</span>    @XmlElementWrapper(name = "rules", namespace = "http://www.travelsky.com/command")    @XmlElement(name="rule",namespace="http://www.travelsky.com/command")    public List<RuleEntity> getRules() {        return rules;    }    public void setRules(List<RuleEntity> rules) {        this.rules = rules;    }}

@XmlRootElement(name="rules", namespace="http://www.travelsky.com/command")public class RuleEntity {    /**     * regex:指令解析的正�?     *      */    private String regex;    /**     * paramKeys:指令解析的key集合     *      */    private List<ParamKeyEntity> paramKeys = new ArrayList<ParamKeyEntity>();    /**     * routingInfo:业务逻辑标识     *      */    private String routingInfo;    /**     * regex_pattern:正则对应的Pattern     *      */    private Pattern regex_pattern;    @XmlElement(name="regex",namespace="http://www.travelsky.com/command")    public String getRegex() {        return regex;    }    /**     *      * setRegex:解析xml时,根据正则生成 Pattern<br/>     *      * @param regex     *            指令的正�?<br/>     */    public void setRegex(String regex) {        this.regex_pattern = Pattern.compile(regex.trim());        this.regex = regex;    }    
    @XmlElementWrapper(name="paramKeys",namespace="http://www.travelsky.com/command")    @XmlElement(name="paramKey",namespace="http://www.travelsky.com/command")    public List<ParamKeyEntity> getParamKeys() {        return paramKeys;    }    public void setParamKeys(List<ParamKeyEntity> paramKeys) {        this.paramKeys = paramKeys;    }    @XmlElement(name="routingInfo",namespace="http://www.travelsky.com/command")    public String getRoutingInfo() {        return routingInfo;    }    public void setRoutingInfo(String routingInfo) {        this.routingInfo = routingInfo;    }    @XmlTransient    public Pattern getRegex_pattern() {        return regex_pattern;    }    public void setRegex_pattern(Pattern regex_pattern) {        this.regex_pattern = regex_pattern;    }}

@XmlRootElement(name="paramKeys", namespace="http://www.travelsky.com/command")public class ParamKeyEntity {    /**     * groupIndex:字段group顺序     *      */    private String groupIndex;    /**     * key:字段的key     *      */    private String key;    @XmlElement(name="groupIndex",namespace="http://www.travelsky.com/command")    public String getGroupIndex() {        return groupIndex;    }    public void setGroupIndex(String groupIndex) {        this.groupIndex = groupIndex;    }    @XmlElement(name="key", namespace="http://www.travelsky.com/command")    public String getKey() {        return key;    }    public void setKey(String key) {        this.key = key;    }}

public class Xml2Object {public static void main(String[] args) {File file = new File("D:/WorkSpace_DEP/Test/src/resources/ft.xml");CommandEntity cmd = parseXml2Object(file);System.out.println(cmd.getCmd());}public static CommandEntity parseXml2Object(File f) {CommandEntity cmd = null;try {JAXBContext jaxbContext = JAXBContext.newInstance(CommandEntity.class);Unmarshaller jaxbUnMarshaller = jaxbContext.createUnmarshaller();cmd = (CommandEntity) jaxbUnMarshaller.unmarshal(f);return cmd;} catch (JAXBException e) {e.printStackTrace();}return cmd;}}





0 0
原创粉丝点击