1. 程式人生 > >android中常用的xml生成與解析

android中常用的xml生成與解析

總結了一下解析XML的三種方式。下圖為要解析的XML的格式。

解析了兩種方式的XML,一種是檔案,另一種是流。

程式碼中用到的許多的類是我虛構出來的,例如在第二種解析中用到的User類。使用者應該先寫這個類,寫出他們的屬性,並寫get和set方法才可以的。

<?xml version="1.0" encoding="utf-8"?>
<users>
 <user id = "1">
  <name>張三</name>
  <sex>男</sex>
  <age>22</age>
  <phone>110</phone>
  <email>

[email protected]</email>
 </user>
</users>

第一種:dom解析xml檔案

(在dom解析中,xml檔案儲存到sdcard上。)

public void domParseXML(){

private static final String USERS_PATH = "/sdcard/userinfo.xml"; 

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

try {

DocumentBuilder  documentBuilder = builderFactory.newDocumentBuilder();

//解析某一路徑下的檔案

Document document = documentBuilder.parse(new File(USERS_PATH));

Element element = document.getDocumentElement();

NodeList nodeList = element.getElementsByTagName("users");

for(int i=0;i<nodeList.getLength();i++){

 Element user = (Element)nodeList.item(i);

 String userid = user.getAttribute("id");

Node name = (Node)user.getElementsByTagName("name").item(0);

Node age = (Node)user.getElementsByTagName("age").item(0);

Node sex = (Node)user.getElementsByTagName("sex").item(0);

Node phone = (Node)user.getElementsByTagName("phone").item(0);

Node email = (Node)user.getElementsByTagName("email").item(0);

 String username = name.getFirstChild().getNodeValue();

 String userage = age.getFirstChild().getNodeValue();

 String usersex = sex.getFirstChild().getNodeValue();

 String userphone = phone.getFirstChild().getNodeValue();

 String useremail = email.getFirstChild().getNodeValue();

//現在就獲得了xml文件中的一個user物件的所有屬性:

//它們是userid,username,userage, usersex,userphone,useremail

//可以建立一個物件,把這些user的內容新增到物件上。在把物件放到//ArrayList中或者是HashMap

}

} catch (ParserConfigurationException e1) {

e1.printStackTrace();

}catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

第二種:xmlPullParser解析xml檔案

public  ArrayList<User>  pullParseXML(InputStream inputStream){

ArrayList<User>  users = null;

User user = null;

try {

//可以用下面兩行的方式建立一個解析器,也可以用第三行註釋的方式建立。

XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();

XmlPullParser parser = xmlPullParserFactory.newPullParser();

//XmlPullParser parser = Xml.newPullParser();建立解析器

} catch (XmlPullParserException e1) 

{

e1.printStackTrace();

}

//解析輸入流

parser.setInput(inputStream);

// 產生第一個事件

int eventType = parser.getEventType();

//下面whileeventType也可以直接寫成parser.next().那樣的話上面一行的int //eventType = parser.getEventType();就不用寫了。

// 當事件不等於文件結束事件時就一直迴圈

while (eventType != XmlPullParser.END_DOCUMENT) {

// 獲取解析器當前指向的元素的名稱

String name = parser.getName();

switch (eventType) {

// 文件開始事件,可以進行資料初始化處理

case XmlPullParser.START_DOCUMENT:

users = new ArrayList<User>();

break;

case XmlPullParser.START_TAG:/開始元素事件

String name = parser.getName();  

if (name.equalsIgnoreCase("user")) {  

user = new User();  

user.setId(new Integer(parser.getAttributeValue(null, "id"))); 

else if(user!=null){

if(name.equalsIgnoreCase("name")){

user.setName(parser.nextText());// 如果後面是Text元素,即返回它的值  

}else if(name.equalsIgnoreCase("age")){

user.setAge(Integer.valueOf(parser.nextText()));

}

else if(name.equalsIgnoreCase("sex")){

user.setSex(parser.nextText());

}

else if(name.equalsIgnoreCase("email")){

user.setEmail(parser.nextText());

}

else if(name.equalsIgnoreCase("phone")){

user.setPhone(parser.nextText());

}

}

break;

case XmlPullParser.END_TAG:// 結束元素事件

if (parser.getName().equalsIgnoreCase("user")&&user!=null) {

matters.add(user);

}

break;

}

eventType = parser.next();// 獲取下一個節點的值

}

inputStream.close();

return users;

}

第三種:SAX解析xml檔案

URL url = new URL( "http://192.168.0.31:8080/myServer/userinfo.xml");

URLConnection urlConnection = url.openConnection();

HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;

InputStream inputStream = httpURLConnection.getInputStream();

// 解析XML

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

SAXParser saxParser = saxParserFactory.newSAXParser();

XMLReader xmlReader = saxParser.getXMLReader();

// MySAXHandler是自定義的類,它繼承了DefaultHandler類

MySAXHandler mySAXHandler = new MySAXHandler();

xmlReader.setContentHandler(mySAXHandler);

xmlReader.parse(new InputSource(inputStream));

//下面是MySAXHandler類的內容,它繼承了DefaultHandler

public class MySAXHandler extends DefaultHandler {

private List<Userusers = new ArrayList<User>();

private User user = null;

private String tagName = null;

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

super.characters(ch, start, length);

if(tagName!=null){  

String data = new String(ch, start, length);  

if(tagName.equals("name")){  

this.user.setName(data);  

}else if(tagName.equals("age")){  

this.user.setAge(data);  

}else if(tagName.equals("sex")){

this.user.setSex(data);

} else if(tagName.equals("phone")){

this.user.setPhone(data);

} else if(tagName.equals("email")){

this.user.setEmail(data);

} 

}

}

@Override

public void endDocument() throws SAXException {

super.endDocument();

}

public List<User> getUsers(){

return users;

}

@Override

public void endElement(String uri, String localName, String qName)throws SAXException {

super.endElement(uri, localName, qName);

if("user".equals(localName)&&user!=null){

users.add(user);

user=null;

}

tagName = null;

}

@Override

public void startDocument() throws SAXException {

super.startDocument();

}

@Override

public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {

if("user".equals(localName)){

user = new User();

user.setId(Integer.parseInt(attributes.getValue("id")));

}

tagName = localName;

}

}

}

第一種往xml中寫入資料的方式:

 (假設要往userinfo.xml檔案中寫內容)

//xml中寫入資料,outfile應該傳入的就是userinfo.xml或者其路徑

//例如:writeXMLFile("/sdcard/userinfo.xml",users)這樣的寫法

//其中users是一個已經存在的ArrayList<User>物件

public void writeXMLFile(String outfile, ArrayList<User> users{

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
  try {
   builder = dbf.newDocumentBuilder();
  } catch (Exception e) {

e.printStackTrace();
  }
  Document doc = builder.newDocument();

  Element root = doc.createElement("users");
  doc.appendChild(root); // 將根元素新增到文件上

  for (int i = 0; i < users.size(); i++) {
   User s = (userusers.get(i);
   // 建立一個user節點
   Element user = doc.createElement("user");
   user.setAttribute("id", s.getId());
   root.appendChild(user);// 新增屬性   

   // 建立姓名節點

   Element name = doc.createElement("name");
   user.appendChild(name);
   Text tname = doc.createTextNode(s.getName());
   name.appendChild(tname);
 // 建立性別節點

   Element sex = doc.createElement("sex");
   user.appendChild(sex);
   Text tsex = doc.createTextNode(s.getSex());
   sex.appendChild(tsex);
//建立年齡節點
 Element age = doc.createElement("age");
 user.appendChild(age); // age新增到學生節點上
 Text tage = doc.createTextNode(s.getAge());
 age.appendChild(tage); // 將文字節點放在age節點上

 // 建立電話節點

   Element phone = doc.createElement("phone");
   user.appendChild(phone);
   Text tphone = doc.createTextNode(s.getPhone());
   phone.appendChild(tphone);
// 建立Email節點

   Element email = doc.createElement("email");
   user.appendChild(email);
   Text temail = doc.createTextNode(s.getEmail());
   email.appendChild(temail);

     }
  try {
 FileOutputStream fos = new FileOutputStream(outfile);
 OutputStreamWriter outwriter = new OutputStreamWriter(fos);

//呼叫callWriteXmlFile()方法
  callWriteXmlFile(doc, outwriter, "UTF-8");
  outwriter.close();
  fos.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

// callWriteXmlFile()方法是對xml的編碼等的操作

public static void callWriteXmlFile(Document doc, Writer w, String encoding) {
  try {
   Source source = new DOMSource(doc);

   Result result = new StreamResult(w);

Transformer xformer = TransformerFactory.newInstance()
     .newTransformer();
   xformer.setOutputProperty(OutputKeys.ENCODING, encoding);
   xformer.transform(source, result);

  } catch (TransformerConfigurationException e) {
   e.printStackTrace();
  } catch (TransformerException e) {
   e.printStackTrace();
  }
 }

第二種往xml中寫入資料的方式:

public static String writerToXml(List<Userusers)

throws IOException {

StringWriter writer = new StringWriter();

XmlSerializer serializer = Xml.newSerializer();

serializer.setOutput(writer);

serializer.startDocument("UTF-8"true);

serializer.startTag(null"users");

for(User user : users){

serializer.startTag(null"user");

serializer.attribute(null"id"user.getId());

//名字

serializer.startTag(null"name");

serializer.text(user.getName());

serializer.endTag(null"name");

//名字

serializer.startTag(null"name");

serializer.text(user.getName());

serializer.endTag(null"name");

//性別

serializer.startTag(null"sex");

serializer.text(user.getSex());

serializer.endTag(null"sex");

//名字

serializer.startTag(null"age");

serializer.text(user.getAge());

serializer.endTag(null"age");

//名字

serializer.startTag(null"phone");

serializer.text(user.getPhone());

serializer.endTag(null"phone");

//Email

serializer.startTag(null"email");

serializer.text(user.getEmail());

serializer.endTag(null"email");

serializer.endTag(null"user");

}

serializer.endTag(null"users");

serializer.endDocument();

}