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();

}

猜你喜欢

转载自blog.csdn.net/shanghome/article/details/8919258