直接上代码:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private static final String TAG = "xxxxxxxxx";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager lm = (LocationManager)getSystemService(LOCATION_SERVICE);
Log.i("xxxxxxxyyyyyyyyy", lm.toString());
// 解析XML
parseXML1(); // XmlPullParser
parseXML2(); // XmlPullParser
parseXML3(); // DOM
parseXML4(); // SAX
}
// 适合没有子标签的XML
private void parseXML1 () {
try {
// XML字符串
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>")
.append("<users><user name=\"allei\"></user><user name=\"boss\"></user></users>");
// 相关准备
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(sb.toString()));
// 开始解析
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_DOCUMENT :
Log.i(TAG, "START_DOCUMENT");
break;
case XmlPullParser.END_DOCUMENT :
Log.i(TAG, "END_DOCUMENT");
break;
case XmlPullParser.END_TAG :
Log.i(TAG, "END_TAG");
break;
case XmlPullParser.START_TAG :
String tagName = parser.getName();
if (tagName.equals("user")) {
String value = parser.getAttributeValue(null, "name");
Log.i("xxxxxxxxxparseXML1()", "name = " + tagName + "; value = " + value);
}
}
type = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 适合没有子标签的XML
private void parseXML2 () {
XmlPullParser parser = getResources().getXml(R.xml.test);
try {
while (parser.next() != XmlPullParser.END_DOCUMENT) {
String name = parser.getName();
if ((name != null)
&& (name.equals("Book") || name
.equals("User"))) {
for (int i = 0; i < parser.getAttributeCount(); i++) {
String attribute = parser.getAttributeName(i);
if ((attribute != null) && attribute.equals("name")) {
String component_name = parser.getAttributeValue(i);
Log.i("xxxxxparseXML2()", component_name);
}
}
} // end if...
} // end while...
} catch (Exception e) {
e.printStackTrace();
}
}
// 适合体积小且含有子标签的XML
private void parseXML3 () {
try {
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>")
.append("<users>")
.append("<user id=\"100\"><name>allei</name><age>20</age></user>")
.append("<user id=\"200\"><name>boss</name><age>40</age></user>")
.append("</users>");
ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(bais);
Element root = document.getDocumentElement();
NodeList nodes = root.getElementsByTagName("user");
String id = "";
String name = "";
String age = "";
for(int i=0; i < nodes.getLength(); i++){
Element personElement = (Element)nodes.item(i);//element /text == node
id = personElement.getAttribute("id");
NodeList childnodes = personElement.getChildNodes();
for(int j=0; j<childnodes.getLength(); j++ ){
Node childNode = (Node)childnodes.item(j);
if(childNode.getNodeType() == Node.ELEMENT_NODE){
Element childElement = (Element)childNode;
if("name".equals(childElement.getNodeName())){
name = childElement.getFirstChild().getNodeValue();
} else if("age".equals(childElement.getNodeName())){
age = childElement.getFirstChild().getNodeValue();
Log.i("xxxxxxxxparseXML3()", "id=" + id + "; name=" + name + "; age=" + age);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 适合体积大,且有子标签的元素。可读性不好。
private void parseXML4 () {
try {
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>")
.append("<users>")
.append("<user id=\"100\"><name>allei</name><age>20</age></user>")
.append("<user id=\"200\"><name>boss</name><age>40</age></user>")
.append("</users>");
ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes());
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
MyXMLContentHandler handler = new MyXMLContentHandler(); // 要定义一个handler
parser.parse(bais, handler);
bais.close();
String result = handler.getResult();
Log.i("xxxxxxxxxxxxparseXML4()", result);
} catch (Exception e) {
e.printStackTrace();
}
}
private class MyXMLContentHandler extends DefaultHandler {
private String preTag; // 上一个标签
private StringBuilder sb = new StringBuilder();
public String getResult () {
return sb.toString();
}
// 接收文档的开始的通知
@Override
public void startDocument() throws SAXException {
}
// 接收字符数据的通知
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String data = new String(ch, start, length);
if ("name".equals(preTag)) {
sb.append("; name=" + data);
} else if ("age".equals(preTag)) {
sb.append("; age=" + data + "]");
}
}
// 接收元素开始的通知
@Override
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
if ("user".equals(localName)) {
sb.append("[id=" + attrs.getValue("", "id"));
}
preTag = localName;
}
@Override
public void endElement(String uri, String localName, String qName) {
preTag = null;
}
}
test.xml
<?xml version="1.0" encoding="utf-8"?>
<Preference xmlns:android="http://schemas.android.com/apk/res/android">
<Books>
<Book name="Thinking in Fuck"/>
<Book name="Thinking in Java"/>
</Books>
<Users>
<User name="Alex"/>
<User name="Alex II"/>
</Users>
</Preference>