2012-02-08 107 views
1

我正在使用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

回答

5

您應該使用它

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

1

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