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.