KXML2错误:PI must not start with xml 如何解决?
最近学习j2me编程,由于本人的手机nokia6670不支持jsr172,只能用KXML2来解析XML,在实际操作中发现如题的异常,苦思无解。
代码如下:
InputStream is=getClass().getResourceAsStream("PBasic.xml");//解析这个XML正常,但添加元素偶尔也会解析错误
//InputStream is=getClass().getResourceAsStream("Patients.xml");解析这个XML文件就出问题
if(is==null){Display.getDisplay(app).setCurrent(new Alert("错误","不能打开XML资源,null,AlertType.ERROR));
return;
}
KXmlParser parser=new KXmlParser();
try {
parser.setInput(is, "UTF-8");
parser.nextTag();//在这里出现异常
…………
查各资料,得到一个帮助大致是说缺少<?xml version="1.0"?>导致的错误,但实际上我的两个XML文件首行均为"<?xml version="1.0" encoding="UTF-8"?>"。源代码缺少注解,看不明白。
平台:eclipse3.42+eclipseme+wtk2.5+jdk1.6
KXML2:下载源代码放入工程编译
PS:网上很多贴子提出nanoxml,我下了一个发现完全不能在CLDC1.0下运行,nanoxml用了大量CLDC不支持的Clone、CharInputStream等方法。
[解决办法]
该回复于2009-03-18 09:57:52被版主删除
[解决办法]
帮顶
[解决办法]
期待高手给个意见,再说下最新的情况。
在kxml2里设置断点,步步分析,发现kxml2在第二次调用内部方法nextImpl()时出错,不知道为什么出错。
没有人碰到这种问题么?
[解决办法]
用下边的代码来解析下,你那XML,如果不能正确输出XML的内容,那有可能是你的XML有问题
private void parseUsingkXML(InputStream is) throws XmlPullParserException {
try {
KXmlParser parser = new KXmlParser();// 实例化
parser.setInput(is, "utf-8");
parsekXMLItems(parser);
} catch (IOException e) {
e.printStackTrace();
}
}
private void parsekXMLItems(KXmlParser parser) throws IOException,
XmlPullParserException {
// 接收事件类型
int eventType = parser.getEventType();
// 当事件类型不为文档末尾时
while (eventType != XmlPullParser.END_DOCUMENT) { // true
// System.out.println("parsekXMLItems");
switch (eventType) {// 判断事件类型
case XmlPullParser.START_TAG:// 为开始标记时
System.out.print("<" + parser.getName());// 输出开始标记
// 当有属性时,输出属性
if (parser.getAttributeCount() >= 1)
for (int i = 0; i < parser.getAttributeCount(); i++) {
// 输出属性名称
System.out
.print(" " + parser.getAttributeName(i) + "=");
// 输出属性值
System.out.print(""" + parser.getAttributeValue(i)
+ """);
}
System.out.print(">");
break;
case XmlPullParser.END_TAG:// 为结束标记时
System.out.print("</" + parser.getName() + ">");
break;
case XmlPullParser.TEXT:// 为文档正文时
// if (!parser.getText().trim().equals("")) {
System.out.print(parser.getText());
// }
break;
case XmlPullParser.END_DOCUMENT:
return;
}
eventType = parser.next();
}
System.out.println();
}