使用XMLpullParser浏览XML文档

时间:2012-02-08 15:26:04

标签: java android

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

谢谢!

2 个答案:

答案 0 :(得分:5)

你应该使用XPath

    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

答案 1 :(得分:1)

XMLPullParser将始终根据您的程序编码的当前方式读取整个文档。 。如果您只想打印ID为2的生物的详细信息,则在记录TEXT事件类型if语句内的生物的名称,种族和性别之前,应确保遇到didId == 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(); 
         }
     }
 }