使用XMLpullParser浏览XML文档

问题描述:

我正在使用XmlPullParserXML文档中提取数据。我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(); 
}  

谢谢!

+0

不应该xpp.next)while循环中的XPath(?读取所有元素没有发生循环(如果我理解你的代码是正确的)。 – kosa 2012-02-08 15:33:24

+0

哎呀忘了粘贴在...编辑,以表明。感谢您的支持。 – SkyeBoniwell 2012-02-08 15:39:45

您应该使用它

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 
+0

你可以在Android上使用xpath吗?谢谢 – SkyeBoniwell 2012-02-08 16:24:17

+1

XPath在SDK 8(2.2)中引入。如果你有较旧的Android,你应该为它找到一些jar。根据这个网站,有一些。 – Gangnus 2012-02-08 16:26:37

+0

在你上面写的示例代码中,你会在哪里使用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(); 
     } 
    } 
} 
+0

噢好吧,所以如果我在启动XMLPullParser之前确定ID,我可以这样做吗?如果(creatureID == 2){//解析XML} – SkyeBoniwell 2012-02-08 15:49:33

+0

等待将无法工作,因为它永远不会到达该XML,因为creatureID永远不会设置为2. – SkyeBoniwell 2012-02-08 15:53:08

+1

我编辑了我的答案,以更准确地显示您需要什么做。显然,我假设你正在努力做的比打印出这些信息要多得多,所以我没有解决其他打印声明。 – 2012-02-08 16:19:28