概述
一概述
xml作为一种数据交互格式,涉及到xml数据的生成与解析,这里将讲述Xml解析的三种方式。
二、Dom解析
1、创建解析器工厂对象(DocumentBuilderFactory对象)
2、创建解析器对象(DocumentBuilder)
3、创建Document对象
例如解析下述文件
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id = "1001">
<id>1</id>
<name>杨威</name>
<address>大连</address>
<age>21</age>
</student>
<student id = "1002">
<id>2</id>
<name>劉海洋</name>
<address>深圳</address>
<age>23</age>
</student>
<student id = "1003">
<id>3</id>
<name>王小波</name>
<address>廣州</address>
<age>22</age>
</student>
</students>
登录后复制
解析代码如下
[code]package com.kuxiao.train.xml;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class XmlParseTest {
public static void main(String[] args) throws Exception {
//xml doc解析步骤
//1、获取解析工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//2、构建解析器对象
DocumentBuilder db = dbf.newDocumentBuilder();
//3、构建docment对象
Document doc = db.parse(new File("person.xml"));
Element ele = doc.getDocumentElement();
//实现解析逻辑
NodeList list = doc.getElementsByTagName("student");
for(int i = 0; i < list.getLength();i++)
{
Element element = (Element) list.item(i);
String attrid = element.getAttribute("id");
System.out.println("attrid = " + attrid);
Element element1 = (Element) element.getElementsByTagName("id").item(0);
String id = element1.getFirstChild().getNodeValue();
System.out.println(id);
element1 = (Element) element.getElementsByTagName("name").item(0);
String name = element1.getFirstChild().getNodeValue();
System.out.println(name);
element1 = (Element) element.getElementsByTagName("address").item(0);
String address = element1.getFirstChild().getNodeValue();
System.out.println(address);
}
}
}
登录后复制
三、注意事项
1、Element ele = doc.getDocumentElement(); 获取根元素
2、获取到元素时,元素的值也是节点,必须element.getFirstChild().getNodeValue()方法取值。
3、xml中的空白也是Node,text类型的。
四、SAX解析
1、创建SAXParserFactory对象
2、创建SAXparser对象
3、创建MyHandler继承DefaultHandler类,重写方法。
4、sp.parse(new File(“student.xml”), new MyHandler(list));
[code]package com.kuxiao.train.xml.sax;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class TestSax {
public static void main(String[] args) throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
List<Student> list = new ArrayList<>();
sp.parse(new File("student.xml"), new MyHandler(list));
System.out.println(list);
}
}
class MyHandler extends DefaultHandler {
private Stack<String> stack = new Stack<>();
private Student student;
private List<Student> mList = null;
public MyHandler(List<Student> list)
{
this.mList = list;
}
@Override
public void startDocument() throws SAXException {
System.out.println("解析文档开始了...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("学生"))
{
student = new Student();
if(attributes.getLength() != 0)
{
for(int i = 0; i < attributes.getLength();i++)
{
String id = attributes.getValue(i);
student.setId(Integer.parseInt(id));
}
}
}
/*if(qName.equals("姓名"))
{
stack.push(qName);
}
if(qName.equals("年龄"))
{
stack.push(qName);
}
if(qName.equals("性别"))
{
stack.push(qName);
}*/
stack.push(qName);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String qName = stack.peek();
if(qName.equals("性别")){
student.setGender(new String(ch,start,length));
}
if(qName.equals("姓名")){
student.setName(new String(ch,start,length));
}
if(qName.equals("年龄")){
student.setAge(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
stack.pop();
if(qName.equals("学生"))
{
mList.add(student);
student = null;
}
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束了.....");
}
}
登录后复制
SAX是基于事件模型的,顺序解析的,内部实现是观察者模式,优势在于占用内存少,效率高,缺点在编码相对比较复杂。
五、Pull解析
1、此解析方式不是JDK自带的,需要导入第三方库
2、创建XmlPullParserFactory对象
3、创建XmlPullParser对象
4、调用xpp.setInput(is,”utf-8”)
5、对应事件类型处理 xpp.next()下一个事件类型
[code]package com.kuxiao.train.xml.pull;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
public class PullTest {
public static void main(String[] args) throws Exception {
FileInputStream is = new FileInputStream(new File("person.xml"));
long time = System.currentTimeMillis();
List<Student> list = new ArrayList<>();
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is, "utf-8");
Student student = null;
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
if (xpp.getName().equals("student")) {
student = new Student();
String id = xpp.getAttributeValue(0);
student.setId(id);
} else if (xpp.getName().equals("name")) {
student.setName(xpp.nextText());
} else if (xpp.getName().equals("address")) {
student.setAddress(xpp.nextText());
} else if (xpp.getName().equals("age")) {
student.setAge(xpp.nextText());
}
break;
case XmlPullParser.START_DOCUMENT:
System.out.println("开始了....");
break;
case XmlPullParser.END_TAG:
if (xpp.getName().equals("student")) {
list.add(student);
student = null;
}
break;
}
eventType = xpp.next();
}
is.close();
long time1 = System.currentTimeMillis();
System.out.println(time1 - time);
for (Student student2 : list) {
System.out.println(student2);
}
FileInputStream fis = new FileInputStream(new File("person.xml"));
List<Student> list1 = getListBean(fis, new String[] { "id", "name",
"address", "age", "gender" }, Student.class, 0);
for (Student student2 : list1) {
System.out.println(student2);
}
}
//封装的全能解析xml文件的方法
//参数说明
//attrs是文件里bean对象的元素与属性名
//clazz是Bean对象的class对象
//j代表属性的个数
public static <T> List<T> getListBean(InputStream is, String[] attrs,
Class<T> clazz, int j) throws Exception {
long time = System.currentTimeMillis();
T c = null;
XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
XmlPullParser xpp = xppf.newPullParser();
xpp.setInput(is, "utf-8");
List<T> list = null;
int eventType = xpp.getEventType();
String classname = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
int bigen = clazz.getName().lastIndexOf(".") + 1;
classname = clazz.getName().substring(bigen);
classname = classname.substring(0, 1).toLowerCase()
+ classname.substring(1);
String elementName = xpp.getName();
if (classname.equals(elementName)) {
c = clazz.newInstance();
if (xpp.getAttributeCount() != 0) {
for (int i = 0; i < j; i++) {
String attrName = xpp.getAttributeName(i);
for (String field : attrs) {
if (field.equals(attrName)) {
String frist = field.substring(0, 1)
.toUpperCase();
Method method = clazz.getDeclaredMethod(
"set" + frist + field.substring(1),
new Class[] { String.class });
method.setAccessible(true);
method.invoke(c, xpp.getAttributeValue(i));
}
}
}
}
} else {
for (String field : attrs) {
if (field.equals(elementName)) {
String frist = field.substring(0, 1).toUpperCase();
Method method = clazz.getDeclaredMethod("set"
+ frist + field.substring(1),
new Class[] { String.class });
method.setAccessible(true);
method.invoke(c, xpp.nextText());
}
}
}
break;
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<T>();
break;
case XmlPullParser.END_TAG:
if (!classname.equals("") && classname.equals(xpp.getName())) {
list.add(c);
c = null;
}
break;
}
eventType = xpp.next();
}
is.close();
long time1 = System.currentTimeMillis();
System.out.println(time1 - time);
return list;
}
}
登录后复制
以上就是详细介绍Xml数据解析的三种方式的示例代码的详细内容,更多请关注靠谱客其它相关文章!
最后
以上就是坚强台灯为你收集整理的详细介绍Xml数据解析的三种方式的示例代码的全部内容,希望文章能够帮你解决详细介绍Xml数据解析的三种方式的示例代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复