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>
</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();
//下面while的eventType也可以直接寫成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<User> users = 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 = (user) users.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<User> users)
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");
serializer.startTag(null, "email");
serializer.text(user.getEmail());
serializer.endTag(null, "email");
serializer.endTag(null, "user");
}
serializer.endTag(null, "users");
serializer.endDocument();
}