关于使用kxml工具的netText()方法

wcjunhua 2009-04-19 01:41:10
我用下面的代码解析WML文件,可为什么总会在每个结束tag输出text呢
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) {
} else if (eventType == XmlPullParser.START_TAG) {
System.out.print("<" + parser.getName());
int size = parser.getAttributeCount();
for(int i=0; i<size; i++){
System.out.print(" " + parser.getAttributeName(i));
System.out.print("=\"" + parser.getAttributeValue(i)+"\"");
url=parser.getAttributeValue(i);
}
System.out.print(">");
} else if (eventType == XmlPullParser.END_TAG) {
System.out.print("</" + parser.getName()+">");
} else if (eventType == XmlPullParser.TEXT) {

System.out.print("text+"+parser.getText());
StringItem s1 =new StringItem("123", parser.getText());
f.append(s1);

}

eventType = parser.next();
}

这是部分解析出来的
<wml>text+
<head><meta http-equiv="Cache-Control" content="max-age=0" forua="true"></meta>text+
</head>text+

这个netText()方法具体怎么用,我想返回开始和结束tag之间的text文本,可总是在结束的tag处输出text,为什么呢?
...全文
148 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcjunhua 2009-04-20
  • 打赏
  • 举报
回复
顶上去啊,跪求
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
拜托给我个小例子,因为我从来没有这样做过
谢谢了
JarodYv 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wcjunhua 的回复:]
链表用hashtable 还是hashmap呢,
我就想把“网易”作为键值,然后“www.163.com”作为Value
当点取某个连接的时候,把文本内容作为查询键值,来读取Value,可以吗?
[/Quote]
首先J2ME中只有HashTable,其实HashTable和HashMap是一样的.
其次,你说的那种方法是不可行的.主要表现为两点:
1, 键值可能由重复.举个例子:<a href="http://url1">点击下载</a><a href="http://url2">点击下载</a>.这种情况按照你的设计,要如何存储呢?
2, 某个标签可能由多个属性.例如<input type="text" name="name" value="value"/>,这些属性用HashTable又将如何存储呢?
这么多标签,这么多属性,不容易抽象出一组良好的属性作为键值.
解决方案是:
为每一个标签生成一个类用于存放其属性和数据,他们继承自一个共同的基类.然后用树也好,链表也好或其他什么方式也好,组织起这些对象.
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
链表用hashtable 还是hashmap呢,
我就想把“网易”作为键值,然后“www.163.com”作为Value
当点取某个连接的时候,把文本内容作为查询键值,来读取Value,可以吗?
JarodYv 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wcjunhua 的回复:]
大哥,我知道树是什么意思,但是我从来没有运用过树的思想写程序,不知道你这个树怎么存储,能不能给个简单的小例子啊,万分感谢
我查了下java 树,还是没查到想要的,都只是说下遍历而已
[/Quote]
"树"算不上编程思想,它仅仅是一种常用的数据结构.
既然你这么不愿意用树,用链表也可以,不过在外部要做很多控制以保证不破坏或者能够还原出xml的树形结构.依然是要维护一个指向队列当前元素的指针.
zhaoyb0319 2009-04-19
  • 打赏
  • 举报
回复
是啊,反正要做替换的
就是去掉那些没用的特殊字符
这还是问题小的呢,假如wml写的不规范解析器直就抛异常了
所以好的方法是,,在解析之前
先把数据进行格式化,比如说一行保存一对Tag
然后保存到vector或是其他能做到的方法,,然后再对它解析
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
我试过你那方法了,还是会出现的
必须是parser.getText()!=null&parser.getText()!=""才行
zhaoyb0319 2009-04-19
  • 打赏
  • 举报
回复
哦,你是说换行这样的Text啊,,这个一般是用一个方法判断下
如果Text是换行符,,直接忽略掉它
就像去掉空格一样
String text = parser.getText().trim();
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
没有,就是会访问tag后面出现的换行,就算是结束tag还是会出现的,因为wml中有换行
zhaoyb0319 2009-04-19
  • 打赏
  • 举报
回复
它的解析过程是完全按照顺序解析的
就是说 Tag头,属性,值,文本 Tag尾
文本不可能出现在Tag尾后的,除非你解析的wml把文本放到了Tag尾部
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
大哥,我知道树是什么意思,但是我从来没有运用过树的思想写程序,不知道你这个树怎么存储,能不能给个简单的小例子啊,万分感谢
我查了下java 树,还是没查到想要的,都只是说下遍历而已
JarodYv 2009-04-19
  • 打赏
  • 举报
回复
用HashTable怎么去标示标签之间的嵌套呢?简单的标签可以,但是遇到复杂的标签,比如<anchor>,HashTable就不灵活了.
树应用很广泛,其实很简单的,数据结构肯定学过.这里不需要建立B+树,B-树,B*树,平衡树,博弈树,线索化树等这些复杂的数据结构,用最原始的树就够了,无非就是一个指向父节点的指针和若干指向子节点的指针.无论从性能(HashTable要进行哈希运算,树通过指针直接引用目标对象)上还是内存开销(HashTable要开辟出比所需要的空间大差不多一倍的空间)上都要优于你用HashTable.

kxml有nextText()这个接口么?我只知道next()接口是用来解析下一个标签的.kxml是开源的,你可以查看kxml的代码,他们的区别就一目了然了.代码是最没有二义性的文档.
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
运用树?我对树不是很了解
可不可以用hashtabel来存储呢?
nextText()和next()有什么区别呢
JarodYv 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wcjunhua 的回复:]
我想解析WAP网站,然后显示出来,假如是“网易”,“新浪”,我怎么解析出来
就是做个浏览器,然后解析到什么就显示什么,但是显示了,怎么把他们正确赋值超链接呢
[/Quote]
xml是一种树形结构文档,利用数来管理解析结果是最自然和方便的.例如"<a href="http://www.163.com">网易</a>".当遇到一个开始标签(XmlPullParser.START_TAG)时,创建一个相应类型的节点,比如超链接类型,将这新建的节点放到树上,当前指针指向新加入的节点.当遇到文字(XmlPullParser.TEXT)时,如果不把他当成上一个标签的子节点,可以把他当成其中的一个属性设置给当前节点(超链接),这就完成了你上面说得赋值.当遇到结束标签(XmlPullParser.END_TAG)时,将指针从当前节点指向当前节点的父亲.这样一直循环下去,知道整个xml解析完毕.
wcjunhua 2009-04-19
  • 打赏
  • 举报
回复
我想解析WAP网站,然后显示出来,假如是“网易”,“新浪”,我怎么解析出来
就是做个浏览器,然后解析到什么就显示什么,但是显示了,怎么把他们正确赋值超链接呢
JarodYv 2009-04-19
  • 打赏
  • 举报
回复
这使正常的.kxml会将两个标签之间的内容解戏成XmlPullParser.TEXT类型.例如<a href="http://xxx">超链接</a>中,超链接3个字被解析为XmlPullParser.TEXT类型,如果用parser.getText(),会返回"超链接".但是如果两个标签之间有空白字符,比如空格,换行符,水平制表符等,kxml依然把他们当成XmlPullParser.TEXT类型返回回来.不过kxml提供了isWhitespace()方法用于判断解析器中当前的值是否为空白字符.在进一步作下面的处理时,可以先判断一下是否是空白字符,如果是,则不进行处理,不是再作进一步处理.因此如果楼主将代码改成:

else if (eventType == XmlPullParser.TEXT) {
boolean isWhitespace = true;
try {
isWhitespace = parser.isWhitespace();
} catch (ParserException ex) {
ex.printStackTrace();
}
if (!isWhitespace) {
System.out.print("text+"+parser.getText());
StringItem s1 =new StringItem("123", parser.getText());
f.append(s1);
}
}


就不会由上面的问题了.

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧