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中的元素和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;
}
}