通过JAXB把XML文件转成JavaBean

1. Jaxb简介

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

2. 例子

@XmlRootElement
public 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;
    }
}
@XmlRootElement
public 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;
    }

}

@XmlRootElement
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值