xml文件如:
<?xml version="1.0" encoding="utf-8" ?>
<item name="aaa" id="2115">
<status>1</status>
<desc>developer</desc>
<users>
<user>
<name>zhangsan</name>
<id>456</id>
</user>
<user>
<name>lisi</name>
<id>789</id>
</user>
</users>
</item>
說明:以上xml文件格式中,開始元素無所謂,想解析那個元素都可以,重要的是結束元素的確定
user,item這兩個元素都可以看成是結束元素,這兩者都分別相當於是兩個model類
public static void main(String[] args) throws IOException,
XMLStreamException {
StaxTest test = new StaxTest();
File file = new File("e:\\user.xml");
test.readTest(file);
}
public void readTest(File file) throws IOException, XMLStreamException {
Long time = null;
XMLInputFactory factory = XMLInputFactory.newInstance(); //建立對象
Reader fileReader = new FileReader(file); //讀取文件
factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
XMLStreamReader reader = factory.createXMLStreamReader(fileReader);
com.text.Item item = null;
List<User> userList = new ArrayList<User>();
User user = null;
try {
while(reader.hasNext()){
int e = reader.next();//取節點標籤是開始標籤還是結束標籤
//確定是開始節點元素
if(e == XMLStreamConstants.START_ELEMENT){
if("item".equalsIgnoreCase(reader.getLocalName())){
item = new com.text.Item();
item.setId(reader.getAttributeValue(null, "id")); //取節點中包含的屬性值
item.setName(reader.getAttributeValue(null, "name"));
}
if("status".equalsIgnoreCase(reader.getLocalName())){
item.setStatus(reader.getElementText()); //取子節點中的節點值
}
if("desc".equalsIgnoreCase(reader.getLocalName())){
item.setDesc(reader.getElementText());
}
if("user".equalsIgnoreCase(reader.getLocalName())){ //每一個user開始標籤,就new一個user對象,然後依次解析user的各個屬性
user = new User();
}
if("id".equalsIgnoreCase(reader.getLocalName())){
user.setId(reader.getElementText());
}
if("name".equalsIgnoreCase(reader.getLocalName())){
user.setName(reader.getElementText());
}
}
//確定是節點結束元素
if(e == XMLStreamConstants.END_ELEMENT){
if("user".equalsIgnoreCase(reader.getLocalName())){ //每一個user結束標籤就將整個user節點中包含的user對象加入到集合中去
userList.add(user);
}
if("item".equalsIgnoreCase(reader.getLocalName())){
item.setUserList(userList);
}
}
}
System.out.println(item.getId()+":"+item.getName()+":"+item.getStatus()+":"+item.getDesc());
for(User u:item.getUserList()){
System.out.println(u.getId()+":"+u.getName());
}
} catch(Exception e){
e.printStackTrace();
}finally {
reader.close();
}
}
實體類:item和user:
package com.text;
import java.util.List;
public class Item {
public String name;
public String id;
public String status;
public String desc;
public List<User> userList;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.text;
public class User {
public String id;
public String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
整個解析過程就是:讀取xml文件,依次讀取元素標籤,標籤分兩種,開始標記和結束標記,碰到開始標記就到開始狀態的處理中進行處理,
碰到結束標記就道結束狀態中處理