xstream 入口类:com.thoughtworks.xstream.XStream
主要支持的解析方式:jdom,xmlpull,dom4j,jdom.
默认的解析方式:xmlpull 包解析(该包的解析速度据说超过sax解析,J2ME解析xml会用到该包)
刚刚查了下资料,发现原来除了熟悉的Dom(基于DOM树)解析,Sax(基于事件)解析外,前两者都需要一次性析, 还有一种就是XPP解析(XPP解析支持断点解析)。
xstream可以解析私有的属性,不知道这点是怎么做到的?有待研读。。。。
刚才换了一个xom,dom4j的解析方式,发现解析不出东西,应该和xmlpull的解析有关。
在xmlpull解析中,一般使用kxml.jar,该包包含了xmlpull并对它进行了扩展,但xstream种用的是xpp3.jar。如果单单使用xmlpull.jar会报XmlPullParserException异常。
kxml解析的基本实现 :
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class XmlPullTest
{
private static String xml = "<Student><name>张三</name><age>23</age></Student>";
public static void main(String args[])
throws XmlPullParserException, IOException
{
ByteArrayInputStream bin = new ByteArrayInputStream(xml.getBytes());
InputStreamReader in = new InputStreamReader(bin);
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(in);
int eventType = parser.getEventType();
// 结束文档解析
while (eventType != XmlPullParser.END_DOCUMENT)
{
if (eventType == XmlPullParser.START_DOCUMENT)
{
System.out.println("Start document:");
}
else if (eventType == XmlPullParser.END_DOCUMENT)
{
System.out.println("End document");
}
else if (eventType == XmlPullParser.START_TAG)
{
System.out.println(" start tag " + parser.getName());
System.out.println(" Start Count: " + parser.getAttributeCount());
int size = parser.getAttributeCount();
for (int i = 0; i < size; i++)
{
System.out.println(" attrName " + parser.getAttributeName(i));
System.out.println(" attrValue " + parser.getAttributeValue(i));
}
}
else if (eventType == XmlPullParser.END_TAG)
{
System.out.println(" end tag " + parser.getName());
}
else if (eventType == XmlPullParser.TEXT)
{
System.out.println(" test: " + parser.getText());
}
eventType = parser.next();
}
}
}