总结了一下解析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();
//下面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();
}