//KXML解释本地或网络上的XML文件
//Newsreader.java
/////////////////////////////////////
import java.io.IOException;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
public class Newsreader extends MIDlet
{
protected void startApp() throws MIDletStateChangeException
{
new ReadThread().start();
}
protected void pauseApp()
{
}
protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException
{
}
class ReadThread extends Thread
{
public void run()
{
try
{
// String = "http://hi.baidu.com/wishwingliao/hao.xml"
// HttpConnection hc = ( HttpConnection ) Connector.open( url );
//
// KXmlParser parser = new KXmlParser();
// parser.setInput( new InputStreamReader( hc.openInputStream() ) );
KXmlParser parser = new KXmlParser();
parser.setInput( this.getClass().getResourceAsStream( "/2.xml" ), null );
readStory( parser );
} catch( Exception e )
{
e.printStackTrace();
}
}
}
void readStory( KXmlParser parser ) throws IOException, XmlPullParserException
{
String s = null;
String responseCode = null;
try
{
//转到下一标签,我用|表示中转到达的位置,如:
//从|<Table>直接跳到
//|<VOX_TYPE ID = "121" LANG = "CN">4</VOX_TYPE>
parser.nextTag();
int eventType = parser.getEventType();// 获取事件类型
// 如果不是整个文档的结尾,那么就读取,这样子就达到遍历整个文档的目的
while( eventType != XmlPullParser.END_DOCUMENT )
{
// 访问文档根节点
if( eventType == XmlPullParser.START_DOCUMENT )
{
parser.nextTag();
}
else if( eventType == XmlPullParser.START_TAG )
{
s = parser.getName();//获取标签名
System.out.println( "解析到" + s + "标签" );
//此处可以对各个标签的属性进行操作
for( int i = 0; i < parser.getAttributeCount(); i ++ )
{
System.out.println( s + "标签" + "属性:" + parser.getAttributeName( i ) + "的值为:" + parser.getAttributeValue( i ) );
}
}
else if( eventType == XmlPullParser.TEXT )
{
responseCode = parser.getText();
System.out.println( "解析标签 " + s + "值为:" + responseCode );
if( s.equals( "VOX_TYPE" ) )
{
responseCode = parser.getText();
System.out.println( "解析标签 data=" + responseCode );
}
if( s.equals( "VOX_TYPE_NAME" ) )
{
responseCode = parser.getText();
System.out.println( "解析标签 data=" + responseCode );
}
}
else if( eventType == XmlPullParser.END_TAG )
{
System.out.println( "结束" + s + "标签解析" );
//System.out.println( "结束" + parser.getName() + "标签解析" );
responseCode = "";
s = "";
}
//转到下一个标记符,比如从<NewDataSet>的"<" 转到 ">"
//我用"|"来标示光标到达的位置来分析整个XML文档的分析过程:
//如:
//<VOX_TYPE ID = "121" LANG = "CN">4</VOX_TYPE>
//<VOX_TYPE_NAME>陆地交通</VOX_TYPE_NAME>
//</Table>
//光标到<|VOX_TYPE ID = "121" LANG = "CN">4</VOX_TYPE>时,用XmlPullParser.START_TAG可判定到达了开始标记
//之后呢,用parser.getName()可获取到标签的名称VOX_TYPE
//用parser.getAttributeCount()可获取到这个标签共有两个属性,即ID和LANG,
//接着通过循环取回属性值,用到的方法:parser.getAttributeName( i )返回属性名,parser.getAttributeValue( i )返回属性值
//
//做完上面的事情好,parser.next()
//这样光标就到达:<VOX_TYPE ID = "121" LANG = "CN"|>4</VOX_TYPE>
//用XmlPullParser.TEXT判断光标已到达标签 ">",用parser.getText()取标签的值为4
//parser.next()
//此时光标<VOX_TYPE ID = "121" LANG = "CN">4<|/VOX_TYPE>
//用XmlPullParser.END_TAG判断知道是结束标记,打印System.out.println( "结束" + s + "标签解析" )
//parser.next()
//此时光标<VOX_TYPE ID = "121" LANG = "CN">4</VOX_TYPE|>
//用XmlPullParser.TEXT判断光标已到达标签 ">",用parser.getText()取标签的值为空
//parser.next()
//此时光标到达<VOX_TYPE ID = "121" LANG = "CN">4</VOX_TYPE>的一下行:
//<|VOX_TYPE_NAME>陆地交通</VOX_TYPE_NAME>
//用XmlPullParser.START_TAG可判定到达了开始标记
//用parser.getName()可获取到标签的名称VOX_TYPE_NAME
//parser.next()
//此时光标位置<VOX_TYPE_NAME|>陆地交通</VOX_TYPE_NAME>
//用XmlPullParser.TEXT判断光标已到达标签 ">",用parser.getText()取标签的值为:陆地交通
//parser.next()
//此时光标位置<VOX_TYPE_NAME>陆地交通<|/VOX_TYPE_NAME>
//用XmlPullParser.END_TAG判断知道是结束标记,打印System.out.println( "结束" + s + "标签解析" )
//parser.next()
//此时光标位置<VOX_TYPE_NAME>陆地交通</VOX_TYPE_NAME|>
//用XmlPullParser.TEXT判断光标已到达标签 ">",用parser.getText()取标签的值为空
//parser.next()
//此时光标到达<VOX_TYPE_NAME>陆地交通</VOX_TYPE_NAME>的下一行
//<|/Table>
//用XmlPullParser.END_TAG判断知道是结束标记,打印System.out.println( "结束" + s + "标签解析" )
//因为这时的s为空值,所以只打印:结束标签解析,实际上是指结束Table标签
//parser.next()
//此时光标</Table|>
//用XmlPullParser.TEXT判断光标已到达标签 ">",用parser.getText()取标签的值为:空
System.out.println( "转到下一标记符" );
eventType = parser.next();
}
} catch( Exception e )
{
e.printStackTrace();
}
}
}
2.xml
/////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="GB2312"?>
<string xmlns="http://tempuri.org/">
<NewDataSet>
<Table>
<VOX_TYPE ID = "121" LANG = "CN">4</VOX_TYPE>
<VOX_TYPE_NAME>陆地交通</VOX_TYPE_NAME>
</Table>
<Table>
<VOX_TYPE ID = "122" LANG = "EN">7</VOX_TYPE>
<VOX_TYPE_NAME>空中交通</VOX_TYPE_NAME>
</Table>
<Table>
<VOX_TYPE ID = "123" LANG = "CN">50</VOX_TYPE>
<VOX_TYPE_NAME>娱乐/旅游</VOX_TYPE_NAME>
</Table>
<Table>
<VOX_TYPE ID = "124" LANG = "EN">3</VOX_TYPE>
<VOX_TYPE_NAME>学校活动</VOX_TYPE_NAME>
</Table>
<Table>
<VOX_TYPE ID = "125" LANG = "CN">30</VOX_TYPE>
<VOX_TYPE_NAME>酒吧</VOX_TYPE_NAME>
</Table>
</NewDataSet>
</string>
/////////////////////////////////////////////////////////////////
运行结果
/////////////////////////////////////////////////////////////////
解析到string标签
string标签属性:xmlns的值为:http://tempuri.org/
转到下一标记符
解析标签 string值为:
转到下一标记符
解析到NewDataSet标签
转到下一标记符
解析标签 NewDataSet值为:
转到下一标记符
解析到Table标签
转到下一标记符
解析标签 Table值为:
转到下一标记符
解析到VOX_TYPE标签
VOX_TYPE标签属性:ID的值为:121
VOX_TYPE标签属性:LANG的值为:CN
转到下一标记符
解析标签 VOX_TYPE值为:4
解析标签 data=4
转到下一标记符
结束VOX_TYPE标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到VOX_TYPE_NAME标签
转到下一标记符
解析标签 VOX_TYPE_NAME值为:陆地交通
解析标签 data=陆地交通
转到下一标记符
结束VOX_TYPE_NAME标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到Table标签
转到下一标记符
解析标签 Table值为:
转到下一标记符
解析到VOX_TYPE标签
VOX_TYPE标签属性:ID的值为:122
VOX_TYPE标签属性:LANG的值为:EN
转到下一标记符
解析标签 VOX_TYPE值为:7
解析标签 data=7
转到下一标记符
结束VOX_TYPE标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到VOX_TYPE_NAME标签
转到下一标记符
解析标签 VOX_TYPE_NAME值为:空中交通
解析标签 data=空中交通
转到下一标记符
结束VOX_TYPE_NAME标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到Table标签
转到下一标记符
解析标签 Table值为:
转到下一标记符
解析到VOX_TYPE标签
VOX_TYPE标签属性:ID的值为:123
VOX_TYPE标签属性:LANG的值为:CN
转到下一标记符
解析标签 VOX_TYPE值为:50
解析标签 data=50
转到下一标记符
结束VOX_TYPE标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到VOX_TYPE_NAME标签
转到下一标记符
解析标签 VOX_TYPE_NAME值为:娱乐/旅游
解析标签 data=娱乐/旅游
转到下一标记符
结束VOX_TYPE_NAME标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到Table标签
转到下一标记符
解析标签 Table值为:
转到下一标记符
解析到VOX_TYPE标签
VOX_TYPE标签属性:ID的值为:124
VOX_TYPE标签属性:LANG的值为:EN
转到下一标记符
解析标签 VOX_TYPE值为:3
解析标签 data=3
转到下一标记符
结束VOX_TYPE标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到VOX_TYPE_NAME标签
转到下一标记符
解析标签 VOX_TYPE_NAME值为:学校活动
解析标签 data=学校活动
转到下一标记符
结束VOX_TYPE_NAME标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到Table标签
转到下一标记符
解析标签 Table值为:
转到下一标记符
解析到VOX_TYPE标签
VOX_TYPE标签属性:ID的值为:125
VOX_TYPE标签属性:LANG的值为:CN
转到下一标记符
解析标签 VOX_TYPE值为:30
解析标签 data=30
转到下一标记符
结束VOX_TYPE标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
解析到VOX_TYPE_NAME标签
转到下一标记符
解析标签 VOX_TYPE_NAME值为:酒吧
解析标签 data=酒吧
转到下一标记符
结束VOX_TYPE_NAME标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符
解析标签 值为:
转到下一标记符
结束标签解析
转到下一标记符