2016-08-09 3 views
1

Ich habe Daten zu XML, in denen die App versucht, den entsprechenden Knoten programmgesteuert anhand von Attributen auszuwählen. HierElement basierend auf Attributen auswählen - Einige Elemente fehlen

ist die XML-Datei

<?xml version="1.0" encoding="utf-8"?> 
<CoagAlgo> 
    <AlgoName 
     name="Algo1" 
     state="1.1" 
     references="test1"> 
     <titletext>Title1</titletext> 
     <optText 
      selectState="1.2">opt1</optText> 
     <optText 
      selectState="1.3">opt2</optText> 
    </AlgoName> 
    <AlgoName 
     name="Algo1" 
     state="1.2" 
     references="text2"> 
     <titletext>Title2</titletext> 
     <optText 
      selectState="1.2.1">opt12</optText> 
     <optText 
      selectState="1.2.2">opt13</optText> 
    </AlgoName> 
    <AlgoName 
     name="Algo2" 
     state="1.1" 
     references="text2"> 
     <titletext>Title21</titletext> 
     <optText 
      selectstate="2.1">opt21</optText> 
     <optText 
      selectstate="2.2">opt22</optText> 
    </AlgoName> 
</CoagAlgo> 

Hier ist der Teil des Codes ist;

public class MainActivity extends AppCompatActivity { 
    public static String algoName1="Algo1"; 
    @Override 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String stringXMLContect = null; 
     try { 
      XmlPullParser parser=(XmlPullParser)xmlParserIni(); 
      stringXMLContect= getTitle(parser,algoName1,"1.2"); 

     }catch (XmlPullParserException e){ 
      e.printStackTrace(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     TextView myText=(TextView)findViewById(R.id.textView); 
     myText.setText(stringXMLContect); 
     RadioGroup radioGroup=(RadioGroup)findViewById(R.id.mainGroup); 

     ArrayList<String> optChoices=new ArrayList<String>(); 
     try{ 
      XmlPullParser parser=(XmlPullParser)xmlParserIni(); 
      optChoices=optTextReader(parser,algoName1,"1.1"); 
     }catch (XmlPullParserException e){ 
      e.printStackTrace(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     for (int i=0;i<optChoices.size();i++){ 
      RadioButton radioButton=new RadioButton(this); 
      radioButton.setText(optChoices.get(i)); 
      radioGroup.addView(radioButton); 
     } 

    } 

    private XmlPullParser xmlParserIni() throws XmlPullParserException, IOException { 
    Context context = this.getApplicationContext(); 

    XmlPullParser xmlResourceParser = context.getResources().getXml(R.xml.optchoices); 
    xmlResourceParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,true); 
    return xmlResourceParser; 
} 
    private String getTitle(XmlPullParser xmlResourceParser, String algoName,String algoState)throws XmlPullParserException,IOException{ 
     String attrValue = ""; 
     int eventType=0; 
     while (xmlResourceParser.next()!= XmlPullParser.END_DOCUMENT){ 
      eventType=xmlResourceParser.getEventType(); 
      String algoRootName=xmlResourceParser.getName(); 
      switch (eventType){ 
       case XmlPullParser.START_TAG: 
        if(algoRootName!= null && algoRootName.equalsIgnoreCase("AlgoName")){ 
         String algoCompName=xmlResourceParser.getAttributeValue(null,"name"); 
         String algoCompState=xmlResourceParser.getAttributeValue(null,"state"); 
         if(algoCompName!=null && algoCompName.equalsIgnoreCase(algoName)&& algoCompState!=null && algoCompState.equalsIgnoreCase(algoState)){ 

           xmlResourceParser.next(); 
           if (xmlResourceParser.next() == XmlPullParser.TEXT) { 
            attrValue = xmlResourceParser.getText(); 
           } 
         } 
        } 
        break; 

      } 
      xmlResourceParser.next(); 
    } 

     return attrValue; 
    } 

Dies sollte den Titeltext basierend auf dem Namen und dem Statusattribut jedes AlgoName-Elements zurückgeben. Wenn der Name dem gegebenen Text entspricht, sollte der Titel zurückgegeben werden. Wenn ich den Namen Algo1 gebe und als 1.1 gebe, bekomme ich den richtigen Titel. Wenn ich den Namen Algo1 gebe und als 1.2 gebe, werde ich leer. Wenn ich debugge, kann ich sehen, dass Algo1, state1.1 übergeben wird, aber der Parser scheint den zweiten Teil zu überspringen und direkt Title-Element von Algo1, Zustand 1.2. Bitte hilf mir zu verstehen, was passiert. Vielen Dank im Voraus.

Antwort

1

Entfernen Sie die Zeile 'xmlResourceParser.next();' 4 Zeilen vom Ende der Datei.

Verwandte Themen