1.PULL解析
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 获取XmlPullParser实例
pullParser = factory.newPullParser();
public List<News> pull(XmlPullParser pullParser, InputStream inStream) {
News news = null;
List<News> lists = null;
try {
// 设置解析内容
pullParser.setInput(inStream, "UTF-8");
// 开始
int eventType = pullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = pullParser.getName();
switch (eventType) {
// 文档开始
case XmlPullParser.START_DOCUMENT:
lists = new ArrayList<News>();
break;
// 开始节点
case XmlPullParser.START_TAG:
if ("news".equals(nodeName)) {
news = new News();
} else if ("id".equals(nodeName)) {
news.setId(Integer.parseInt(pullParser.nextText()));
} else if ("title".equals(nodeName)) {
news.setTitle(pullParser.nextText());
} else if ("body".equals(nodeName)) {
news.setBody(pullParser.nextText());
} else if ("commentCount".equals(nodeName)) {
news.setCommentCount(Integer.parseInt(pullParser
.nextText()));
} else if ("author".equals(nodeName)) {
news.setAuthor(pullParser.nextText());
} else if ("authorid".equals(nodeName)) {
news.setAuthorid(Integer.parseInt(pullParser.nextText()));
} else if ("pubDate".equals(nodeName)) {
news.setPubDate(pullParser.nextText());
} else if ("url".equals(nodeName)) {
news.setUrl(pullParser.nextText());
}
break;
// 结束节点
case XmlPullParser.END_TAG:
if ("news".equals(nodeName)) {
lists.add(news);
news = null;
}
break;
default:
break;
}
// 手动的触发下一个事件
eventType = pullParser.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return lists;
}
2.SAX解析
// 获取SAX解析的工厂类
SAXParserFactory instance = SAXParserFactory.newInstance();
private void initData(SAXParserFactory instance) {
try {
// 获取SAX解析的解析类
SAXParser newSAXParser = instance.newSAXParser();
// 获取Xml读取类
XMLReader xmlReader = newSAXParser.getXMLReader();
xmlReader.setContentHandler(new DefaultHandler() {
// 定义全局变量,记录每次读取到的标签的名字
String temp;
City city;
@Override
public void startDocument() throws SAXException {
Log.d("print", "startDocument: " + "文档开始读取");
}
// 读取到开始标签,通过localName判断读取到了哪一个开始标签
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
temp = localName;
Log.d("print", "start: temp" + temp);
// 判断是不是开始标签
if ("city".equals(temp)) {
// 实例化要封装的对象
city = new City();
// 获取值,将值封装入对象
String id = attributes.getValue("id");
city.setId(Integer.parseInt(id));
}
}
// 得到标签内携带的数据
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 将字符数组转换成为字符串
String str = new String(ch, start, length);
Log.d("print", "characters :" + str);
if ("name".equals(temp)) {
city.setName(str);
} else if ("type".equals(temp)) {
city.setType(str);
} else if ("address".equals(temp)) {
city.setAddress(str);
}
}
@Override
public void endElement(String uri, String localName,
String qName) throws SAXException {
temp = localName;
Log.d("print", "end temp :" + temp);
if ("city".equals(temp)) {
// 添加到集合
data.add(city);
// 对象置空
city = null;
}
// 清空记录变量的标签
temp = null;
}
@Override
public void endDocument() throws SAXException {
Log.d("print", "endDocument:" + "文档读取完毕");
}
});
// 设置要读取的源文件
xmlReader.parse(new InputSource(getAssets().open("city.xml")));
} catch (Exception e) {
e.printStackTrace();
Log.d("print", "异常了:");
}
}
3.DOM解析
// 得到DOM解析的工厂类
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
try {
// 得到DOM方式的解析类
DocumentBuilder documentbuilder = builderFactory
.newDocumentBuilder();
// 通过输入流设置要解析的xml文件,得到Document(文本对象),包含当前xml的信息
Document document = documentbuilder.parse(getAssets().open("data.xml"));
// 获得根元素 (根节点)<persons>
Element documentElement = document.getDocumentElement();
// 得到根元素下所有的子节点
NodeList childNodes = documentElement.getChildNodes();
// 遍历出根元素下所有的子节点
for (int i = 0; i < childNodes.getLength(); i++) {
// 每一个子节点下的数据,都封装成一个对象
Person p = new Person();
// 按角标取得相对应的子节点
Node node = childNodes.item(i);
// 判断节点是不是元素
if (node.getNodeType() == Node.ELEMENT_NODE) {
// 把子节点转换成为元素
Element element = (Element) node;
// 得到当前元素的属性节点
String id = element.getAttribute("id");
p.setId(Integer.parseInt(id));
// 得到<person>节点的所有子节点 <name>lee</name>和 <age>30</age>
NodeList childNodes2 = element.getChildNodes();
for (int j = 0; j < childNodes2.getLength(); j++) {
// j=0时,得到 <name>lee</name>,j=1时,得到 <age>30</age>
Node item = childNodes2.item(j);
// 判断节点是不是元素点
if (item.getNodeType() == Node.ELEMENT_NODE) {
// 把节点转换成为元素
Element element2 = (Element) item;
// 得到标签所包含的文本
String value = element2.getFirstChild()
.getNodeValue();
// 如果标签是<name>,取出标签的文本内容,封装到person对象里
if ("name".equals(element2.getNodeName())) {
p.setName(value);
} else if ("age".equals(element2.getNodeName())) {
p.setAge(Integer.parseInt(value));
}
}
}
Log.d("print", p.toString());
// 把封装的信息存入集合中
data.add(p);
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}