<pre class="html" name="code">在工作中遇到了需要读取xml的业务,发现原代码使用的是dom4j,因为这个xml的节点层次比较深,原代码显得杂乱无章,因为我修改了代码使用了jaxb读取xml
jaxb 的优势在于他可以以javabean 注入的方式映射到xml,代码干净利落。
我写了一个demo,我们先看下xml文件的结构
<ArticleData>
<article>
<title>super</title>
<email>xubing@thunisoft.com</email>
<date>2016/07/14</date>
<articleChild>
<super>super
</super>
</articleChild>
</article>
<test>我是test</test>
<ee></ee>
</ArticleData>
首先 ArticleDate 节点对应的javabean 根节点必须用@XmlRootElement(name="ArticleDate") 这个注入
package com.superbing.thunisoft.ajaxb.bean;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="ArticleData")
public class ArticleData {
private List<Article> article = new ArrayList<Article>();
private String test;
private String wca;
public final String getWca() {
return wca;
}
public final void setWca(String wca) {
this.wca = wca;
}
public final String getTest() {
return test;
}
public final void setTest(String test) {
this.test = test;
}
public final List<Article> getArticle() {
return article;
}
public final void setArticle(List<Article> article) {
this.article = article;
}
}
接下来是Article 节点 这里有一个@XmlElement(name="super") 这里 name = super 是一个别名的性质,child这个节点对应的xml里的节点可以叫super 而不是child
package com.superbing.thunisoft.ajaxb.bean;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
public class ArticleChild {
private String child;
@XmlElement(name="super")
public final String getChild() {
return child;
}
public final void setChild(String child) {
this.child = child.trim();
}
}
最后是 Article 节点
package com.superbing.thunisoft.ajaxb.bean;
import java.util.ArrayList;
import java.util.List;
public class Article {
private String title;
private String email;
private String date;
List<ArticleChild> articleChild = new ArrayList<ArticleChild>();
public final List<ArticleChild> getArticleChild() {
return articleChild;
}
public final void setArticleChild(List<ArticleChild> articleChild) {
this.articleChild = articleChild;
}
public final String getTitle() {
return title;
}
public final void setTitle(String title) {
this.title = title;
}
public final String getEmail() {
return email;
}
public final void setEmail(String email) {
this.email = email;
}
public final String getDate() {
return date;
}
public final void setDate(String date) {
this.date = date;
}
}
好了,读取xml的时候到了。 这里的for 循环是为了测试 代码用的。。 下班了拜拜
package com.superbing.thunisoft.ajaxb.xmlread;
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.superbing.thunisoft.ajaxb.bean.Article;
import com.superbing.thunisoft.ajaxb.bean.ArticleChild;
import com.superbing.thunisoft.ajaxb.bean.ArticleData;
public class TestAjaxb {
public static void main(String[] args) {
File xmlFile = new File("C:\\Users\\Administrator\\Desktop\\jaxb.xml");
JAXBContext context;
try {
context = JAXBContext.newInstance(ArticleData.class);
Unmarshaller unm = context.createUnmarshaller();
ArticleData data = (ArticleData) unm.unmarshal(xmlFile);
System.out.println(data.getTest());
List<Article> list = data.getArticle();
for(Article art:list) {
for(ArticleChild cd : art.getArticleChild()){
System.out.println(cd.getChild() + "super");
}
System.out.println(art.getTitle());
}
} catch (JAXBException e) {
e.printStackTrace();
}
}
}