通过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 rules = new ArrayList();

    @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 getRules() {
        return rules;
    }

    public void setRules(List 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 paramKeys = new ArrayList();

    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 getParamKeys() {
        return paramKeys;
    }

    public void setParamKeys(List 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:


  FT
  2
  
    
    
    
      ^FT\s*:?\s*-\s*(\S*)?$
      
        
        
          1
          other
        
      
      cancelFt
    


    
    
      
      ^FT\s*:?\s*(\w{2})?(\d{3,4})([A-Z])?(/([.+-]|\d{1,2}[A-Z]{3}(\d{2})?))?(/(.*))?$
      
      
        
          1
          airlineCode
        
        
          2
          fltNo
        
        
          3
          fltNoSuffix
        
        
          5
          fltDate
        
        
          8
          depStationCode
        
      
      setFt
    


    
    
      ^FT\s*:?\s*(.*)?$
      
        
          1
          fltInfo
        
      
      showFt
    
  

解析程序为:
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类名不一致的例子。


  FT
  2
  
    
      ^FT\s*:?\s*-\s*(\S*)?$
      
        
          1
          other
        
      
      cancelFt
    

    
      ^FT\s*:?\s*(\w{2})?(\d{3,4})([A-Z])?(/([.+-]|\d{1,2}[A-Z]{3}(\d{2})?))?(/(.*))?$
      
      
        
          1
          airlineCode
        
        
          2
          fltNo
        
        
          3
          fltNoSuffix
        
        
          5
          fltDate
        
        
          8
          depStationCode
        
      
      setFt
    
    
    
      ^FT\s*:?\s*(.*)?$
      
        
          1
          fltInfo
        
      
      showFt
    
  

对应的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 rules = new ArrayList();

    @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;
    }
    // 注意:对于数组的形式,一定要增加一个注解XmlElementWrapper,否则xml无法正确解析
    @XmlElementWrapper(name = "rules", namespace = "http://www.travelsky.com/command")
    @XmlElement(name="rule",namespace="http://www.travelsky.com/command")
    public List getRules() {
        return rules;
    }

    public void setRules(List rules) {
        this.rules = rules;
    }
}

@XmlRootElement(name="rules", namespace="http://www.travelsky.com/command")
public class RuleEntity {

    /**
     * regex:指令解析的正�?
     * 
     */
    private String regex;

    /**
     * paramKeys:指令解析的key集合
     * 
     */
    private List paramKeys = new ArrayList();

    /**
     * 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
* * @param regex * 指令的正�?
*/ 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 getParamKeys() {
        return paramKeys;
    }

    public void setParamKeys(List 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;
	}

}





你可能感兴趣的:(通过JAXB把XML文件转成JavaBean)