使用XMLpullParser浏览XML文档
我正在使用XmlPullParser
从XML文档中提取数据。我XML文件的结构是这样的:使用XMLpullParser浏览XML文档
<creature id="1">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
<creature id="2">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
<creature id="3">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
我的代码正在工作,如果我只有一个生物在我XML文件。
我正在寻找一种基于生物ID选择生物的方法。例如,如果ID是2,那么XMLPullParser
只会解析生物ID =“2”下的XML。
这里是我到目前为止的代码:
xpp.next();
String elName = "";
int encounterId = 0;
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT)
{
if(eventType == XmlPullParser.START_DOCUMENT)
{
System.out.println("START_DOCUMENT "+xpp.getName());
}
else if(eventType == XmlPullParser.START_TAG)
{
if(encounterId >= 0) {
if(xpp.getName().equalsIgnoreCase("creature")) {
System.out.println("inside while loop --- "+xpp.getName());
try {
encounterId = Integer.parseInt(xpp.getAttributeValue(0));
System.out.println("attribute value = " + encounterId);
} catch (NumberFormatException e) {
Log.e("attribute value error", e.getMessage());
}
//DETERMINE ELEMENT NAME
} else if(xpp.getName().equalsIgnoreCase("name")) {
System.out.println("inside while loop --- "+xpp.getName());
elName = "name";
} else if(xpp.getName().equalsIgnoreCase("type")) {
elName = xpp.getName();
elName = "type";
} else if(xpp.getName().equalsIgnoreCase("size")) {
elName = xpp.getName();
elname = "size";
}
} else if(eventType == XmlPullParser.END_TAG) {
System.out.println("End tag "+xpp.getName());
} else if(eventType == XmlPullParser.TEXT) {
//COLLECT DATA
if(elName.equalsIgnoreCase("name")) {
this.name = xpp.getText();
} else if(elName.equalsIgnoreCase("type")) {
this.race = xpp.getText();
} else if(elName.equalsIgnoreCase("size")) {
this.gender = xpp.getText();
}
eventType = xpp.next();
}
谢谢!
您应该使用它
XmlPullParser xpp = context.getResources().getXml(R.xml.zoo_table);
XPath xpath = XPathFactory.newInstance().newXPath();
try {
String askFor2 = "//creature[@ID='2']";
NodeList creaturesNodes = (NodeList) xpath.evaluate(askFor2, xpp, XPathConstants.NODESET);
// here you have all such creatures - the list of one node in your case
你可以在Android上使用xpath吗?谢谢 – SkyeBoniwell 2012-02-08 16:24:17
XPath在SDK 8(2.2)中引入。如果你有较旧的Android,你应该为它找到一些jar。根据这个网站,有一些。 – Gangnus 2012-02-08 16:26:37
在你上面写的示例代码中,你会在哪里使用askFor2?谢谢 – SkyeBoniwell 2012-02-08 16:47:33
XMLPullParser将始终根据当前编写程序的方式读取整个文档。 。如果您只想打印出ID为2的生物的详细信息,则应在记录TEXT事件类型if语句内的生物名称,种族和性别之前,确保meetId == 2。
XMLPullParser无法知道在文档中的某处是否存在ID为2的内容并且只是跳到它。这种XML解析风格从头开始读取XML文档,直到您决定停止解析。
编辑 更具体的代码
else if(eventType == XmlPullParser.TEXT) {
//COLLECT DATA
if(encounterId == 2) {
if(elName.equalsIgnoreCase("name")) {
this.name = xpp.getText();
} else if(elName.equalsIgnoreCase("type")) {
this.race = xpp.getText();
} else if(elName.equalsIgnoreCase("size")) {
this.gender = xpp.getText();
}
}
}
噢好吧,所以如果我在启动XMLPullParser之前确定ID,我可以这样做吗?如果(creatureID == 2){//解析XML} – SkyeBoniwell 2012-02-08 15:49:33
等待将无法工作,因为它永远不会到达该XML,因为creatureID永远不会设置为2. – SkyeBoniwell 2012-02-08 15:53:08
我编辑了我的答案,以更准确地显示您需要什么做。显然,我假设你正在努力做的比打印出这些信息要多得多,所以我没有解决其他打印声明。 – 2012-02-08 16:19:28
不应该xpp.next)while循环中的XPath(?读取所有元素没有发生循环(如果我理解你的代码是正确的)。 – kosa 2012-02-08 15:33:24
哎呀忘了粘贴在...编辑,以表明。感谢您的支持。 – SkyeBoniwell 2012-02-08 15:39:45