2013-03-26 45 views
1

我想解析从数据库软件导出的XML文件,用于我的android应用程序。 然而,一些标签的纷纷议论,像这样:Android:解析XML数据:带参数的标签

<row>
<value column="Index" null="false">1</value>
<value column="Front" null="false">INFO</value>
<value column="Back" null="false">INFO</value>
<value column="Check" null="false">0</value>
</row>

做我试图找到开始标记解析它指定哪些字符串值? (例如:找到行我比较开始水龙头“行”,如果它返回真我计算数据。我该怎么做每个值,即索引,正面,背面和检查分开?)

我的Java代码如下

try{ 
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    XmlPullParser xpp = factory.newPullParser(); 

    InputStream stream = context.getResources().openRawResource(com.Whydea.chemistryhelper.R.raw.appxml); 
    xpp.setInput(stream, null); 

    int eventType = xpp.getEventType(); 
    while (eventType != XmlPullParser.END_DOCUMENT){ 
     if(eventType==XmlPullParser.START_TAG){ 
      handleStartTag(xpp.getName()); //handels Start Tag 
     } else if (eventType==XmlPullParser.END_TAG){ 
      handleEndTag(xpp.getName()); 
      Ctag=null; 
     } else if (eventType==XmlPullParser.TEXT){ 
      handleText(xpp.getText()); 
     } 
     eventType=xpp.next(); 
    } 

    }catch (NotFoundException e){ 
     Log.d("XMLpp",e.getMessage());   
    }catch (XmlPullParserException e){ 
     Log.d("XMLpp",e.getMessage()); 
    }catch (IOException e){ 
     Log.d("XMLpp",e.getMessage()); 
    }  

`

编辑:

每个 “身价” 开始标记有自己的属性(列= ...),我如何访问这些?

例如:要访问一个行,我有一个字符串常量,值为“row”,并检查开始标记是否与此对应,并且它有效。但是,当我声明一个字符串常量的值“值列= \”检查\“空= \”假\“”(我必须使用\其他明智的“给错误),它没有找到找到开始标签。应我的常数是什么?

回答

0

如果我明白你的问题正确,则让每一个你需要做以下的值,基本上你想获得每个属性的值的XML标签内

  int attributeCount = xpp.getAttributeCount(); 
     for(int i = 0; i<attributeCount; i++){ 
      String name = xpp.getAttributeName(i); 
      //Log.d(TAG, "Name: "+name); 
      if(name != null && name.equalsIgnoreCase("column")){ 

       return Integer.parseInt(xpp.getAttributeValue(i));     
      } 
     } 

所以一旦遇到该行,就会在查找到起始标签“value”后找到它,然后使用上面的代码获取属性的单个值。

按照你的评论,如果你想获得一个XML标签的文本值,那么你将不得不使用getText()方法。一旦你找到了START_TAG值然后执行以下代码:

    eventType = xpp.next(); 
        if(eventType == XmlPullParser.TEXT){ 
         String text = xpp.getText();        
        } 

的XML标签“INFO”值将返回“INFO”

+0

<值列=“返回”空=“假”> INFO,我想要的信息数据 – xSooDx 2013-03-26 12:44:29

+0

我已编辑我的答案如何检索文本值'信息' – 2013-03-26 12:54:30

+0

非常感谢,这解决了我的问题。 – xSooDx 2013-03-26 15:10:10

0

你开发生成XML文件中的应用程序?如果是这样,你为什么不改变它?这将是更容易解析XML,如果它具有以下格式:

<item Index="1" Front="INFO" Back="INFO" Check="0"/> 
<item Index="2" Front="INFO" Back="INFO" Check="1"/> 
+0

他们仍然有不同的属性。我如何访问这些属性来识别它们? – xSooDx 2013-03-26 11:22:06

+0

使用SAX解析器:只需重写_startElement_,_endElement_和_character_方法。 在_startElement_中,您可以获得每个XML节点,并且可以获取属性值。怎么样?使用_Attributes_对象(_startElement_参数):您将获得“INFO”执行此操作_attributes.getValue(“Front”)_ – Alberto 2013-03-26 17:50:25

0
try { 
     final Service S = new Service(); 
     String xmlString = S.ImportAllPollBoothStatus(IMEI,asscd, boothno); 
     if(xmlString.toLowerCase().trim().equals("false")){ 
      return false; 
     } 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(xmlString)); 
     Document doc = docBuilder.parse(is); 

     NodeList nodes = doc.getElementsByTagName("HT"); 

     for (int i = 0; i < nodes.getLength(); i++) { 

      Element element = (Element) nodes.item(i); 
      NodeList blockidnodes = doc.getElementsByTagName("Table"); 

      for (int blockidcount = 0; blockidcount < blockidnodes 
        .getLength(); blockidcount++) { 

       NodeList PollpercentId = element 
         .getElementsByTagName("PollpercentId"); 
       Element line1 = (Element) PollpercentId.item(blockidcount); 

       NodeList asscd1 = element 
         .getElementsByTagName("asscd"); 
       Element line2 = (Element) asscd1.item(blockidcount); 

       NodeList pollgcd = element 
         .getElementsByTagName("pollgcd"); 
       Element line3 = (Element) pollgcd.item(blockidcount); 


       NodeList SessionYearIdref = element 
         .getElementsByTagName("SessionYearIdref"); 
       Element line4 = (Element) SessionYearIdref.item(blockidcount); 

       NodeList MaleVoters = element 
         .getElementsByTagName("MaleVoters"); 
       Element line5 = (Element) MaleVoters.item(blockidcount); 

       NodeList FemaleVoters = element 
         .getElementsByTagName("FemaleVoters"); 
       Element line6 = (Element) FemaleVoters.item(blockidcount); 

       NodeList UpdatedDate = element 
         .getElementsByTagName("UpdatedDate"); 
       Element line7 = (Element) UpdatedDate.item(blockidcount); 

       NodeList timeslot = element 
         .getElementsByTagName("timeslot"); 
       Element line8 = (Element) timeslot.item(blockidcount); 


      this.db.insertVotingStatus(
         getCharacterDataFromElement(line1), 
         getCharacterDataFromElement(line2), 
         getCharacterDataFromElement(line3), 
         getCharacterDataFromElement(line4), 
         getCharacterDataFromElement(line5), 
         getCharacterDataFromElement(line6), 
         getCharacterDataFromElement(line7), 
         getCharacterDataFromElement(line8)); 

      } 
     } 


    } 
    catch (Exception e) { 
     Log.e("EXCEPTION DURING VIDHANSABHA INSERION", 
       "======Insert-VIDHANSABHA-DETAILS=====================" + e); 
     return false; 
    } 
    return true; 
代码