使用JAXB将XML标签内容存储至不同命名变量的技术问题
解决JAXB绑定XML标签到不同变量名的问题
嘿,这个问题我之前也踩过坑!JAXB根本不需要变量名和XML标签名必须一致,用@XmlElement注解就能轻松搞定自定义映射,我结合你给的XML示例一步步教你怎么做:
首先先把你的XML补全(看你输入的最后一个标签是DATAGENERATIO,应该是打漏了最后一个字母?我假设是DATAGENERATION,如果实际是其他名称,后续修改注解里的对应值就行):
<?xml version="1.0" encoding="UTF-8"?> <PORTAL> <NAME>PERSON 2.0</NAME> <ID>99995</ID> <DATAGENERATION>2008-04-10</DATAGENERATION> </PORTAL>
第一步:创建对应的实体类,用@XmlElement指定标签映射
比如你想把<NAME>存到portalName变量,<ID>存到portalId,<DATAGENERATION>存到generateDate,实体类这么写:
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "PORTAL") // 指定根标签名 public class Portal { // 用name属性指定对应的XML标签名,完全不用管变量名和标签名是否一致 @XmlElement(name = "NAME") private String portalName; @XmlElement(name = "ID") private Integer portalId; @XmlElement(name = "DATAGENERATION") private String generateDate; // 必须保留无参构造函数,JAXB反序列化时需要用它创建对象 public Portal() {} // 生成getter和setter方法,方便后续获取变量值 public String getPortalName() { return portalName; } public void setPortalName(String portalName) { this.portalName = portalName; } public Integer getPortalId() { return portalId; } public void setPortalId(Integer portalId) { this.portalId = portalId; } public String getGenerateDate() { return generateDate; } public void setGenerateDate(String generateDate) { this.generateDate = generateDate; } }
第二步:编写解析String类型XML的代码
接下来把存储在String里的XML解析成刚才的实体类对象,就能通过自定义变量名获取内容了:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.StringReader; public class XmlParser { public static void main(String[] args) { // 假设你的XML字符串存在这里 String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<PORTAL>\n" + " <NAME>PERSON 2.0</NAME>\n" + " <ID>99995</ID>\n" + " <DATAGENERATION>2008-04-10</DATAGENERATION>\n" + "</PORTAL>"; try { // 初始化JAXB上下文,关联我们的实体类 JAXBContext context = JAXBContext.newInstance(Portal.class); Unmarshaller unmarshaller = context.createUnmarshaller(); // 把String转成Reader,再解析成Portal对象 StringReader reader = new StringReader(xmlStr); Portal portal = (Portal) unmarshaller.unmarshal(reader); // 现在就可以用自定义的变量名获取XML里的内容了 System.out.println("门户名称:" + portal.getPortalName()); System.out.println("门户ID:" + portal.getPortalId()); System.out.println("生成日期:" + portal.getGenerateDate()); } catch (JAXBException e) { e.printStackTrace(); } } }
关键点说明
@XmlRootElement(name = "PORTAL"):指定当前类对应XML的根标签<PORTAL>@XmlElement(name = "标签名"):核心注解,告诉JAXB“这个变量对应XML里的哪个标签”,彻底摆脱变量名和标签名必须一致的限制- 无参构造函数是硬性要求:JAXB在反序列化XML到Java对象时,必须通过无参构造函数创建实例
- 如果你的XML带有命名空间,还可以用
@XmlNamespace注解配合处理,不过你的示例里没有,暂时不用考虑
这样就能完美实现把XML标签内容存到自定义名称的变量里啦!
内容的提问来源于stack exchange,提问作者Pistacho Olvidado
相关产品推荐
相关产品推荐

