2016-11-03 1 views
0

Die XML-Datei, die ich Parsen bin ist alltrains.xml alsAndroid: XML-Datei parsen, aber nicht mehr als ein Element durch Klassenobjekt immer Zugriff

<?xml version="1.0" encoding="utf-8"?> 

    <resources> 
<train> 
    <trainno>02018</trainno> 
    <name>GKP LTT PREMIUM</name> 
    <sourcestation>GORAKHPUR JN</sourcestation> 
    <deptime>08:25</deptime> 
    <destinationstation>LOKMANYATILAK T</destinationstation> 
    <destarrtime>11:50</destarrtime> 
</train> 
<train> 
    <trainno>02529</trainno> 
    <name>GKP UHP PREMIUM</name> 
    <sourcestation>GORAKHPUR JN</sourcestation> 
    <deptime>20:55</deptime> 
    <destinationstation>UDHAMPUR</destinationstation> 
    <destarrtime>21:30</destarrtime> 
</train> 
<train> 
    <trainno>02530</trainno> 
    <name>UHP GKP PREMIUM</name> 
    <sourcestation>UDHAMPUR</sourcestation> 
    <deptime>23:45</deptime> 
    <destinationstation>GORAKHPUR JN</destinationstation> 
    <destarrtime>23:20</destarrtime> 
</train> 
<train> 
    <trainno>02680</trainno> 
    <name>SVDK YPR PREMIUM</name> 
    <sourcestation>SHMATA VD KATRA</sourcestation> 
    <deptime>06:30</deptime> 
    <destinationstation>YESVANTPUR JN</destinationstation> 
    <destarrtime>15:00</destarrtime> 
</train> 
<train> 
    <trainno>02696</trainno> 
    <name>JP YPR PREMIUM</name> 
    <sourcestation>JAIPUR</sourcestation> 
    <deptime>22:15</deptime> 
    <destinationstation>YESVANTPUR JN</destinationstation> 
    <destarrtime>17:55</destarrtime> 
</train> 
    </resources> 

Der Code von MainActivity.java folgt, ist wie folgt

public class MainActivity extends AppCompatActivity 
{ 
static Resources myResources; 
static InputStream inputStream; 
TechCrunchTask downloadTask; 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myResources = getResources(); 
    downloadTask=new TechCrunchTask(); 
    downloadTask.execute(); 
} 

public static class TechCrunchTask extends AsyncTask<Void,Void,ArrayList<HashMap<String,String>>> 
{ 
    @Override 
    protected ArrayList<HashMap<String,String>> doInBackground(Void... params) 
    { 
     ArrayList<HashMap<String,String>> results=new ArrayList<>(); 
     try { 
      inputStream = myResources.openRawResource(R.raw.alltrains); 

      results=ProcessXml(inputStream); 
     } 
     catch (Exception e) 
     { 
      //e.printStackTrace(); 
     } 
     return results; 
    } 
    @Override 
    protected void onPostExecute(ArrayList<HashMap<String,String>> result) 
    { 
     // L.m(result+""); 
    } 

    public ArrayList<HashMap<String,String>> ProcessXml (InputStream inputStream) throws Exception 
    { 
     DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); 
     DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder(); 
     Document xmlDocument=documentBuilder.parse(inputStream); 
     Element RootElement=xmlDocument.getDocumentElement(); 
     Log.d("ResourceName",xmlDocument.getDocumentElement().toString()); 
     NodeList itemList=RootElement.getElementsByTagName("train"); 
     Node CurrentItem=null; 
     NodeList ItemChildren=null; 
     Node CurrentChild=null; 
     NamedNodeMap MediaThumbnailAttributes=null; 
     Node CurrentAttribute=null; 
     int count=0; 

     ArrayList<HashMap<String,String>> results=new ArrayList<>(); 
     for(int i=0;i<itemList.getLength();i++) 
     { 
      CurrentItem=itemList.item(i); 

      ItemChildren=CurrentItem.getChildNodes(); 
      for(int j=0;j<ItemChildren.getLength();j++) 
      { 
       TrainObject trainObject=new TrainObject(); 
       CurrentChild=ItemChildren.item(j); 
       String name=""; 
       int id; 
       trainObject.setId(i+1); 
       Log.d("ID",Integer.toString(trainObject.getId())); 
       if(CurrentChild.getNodeName().equalsIgnoreCase("name")) 
       { 
        name=CurrentChild.getTextContent(); 
        // Log.d("Name",name); 
        trainObject.setTrainName(name); 
        Log.d("Name",trainObject.getTrainName()); 
        Log.d("Object",""+Integer.toString(trainObject.getId())+":"+Integer.toString(trainObject.getTrainNo())); 
       } 
       if(CurrentChild.getNodeName().equalsIgnoreCase("trainno")) 
       { 
        id=Integer.parseInt(CurrentChild.getTextContent()); 
        //Log.d("ID",Integer.toString(id)); 
        trainObject.setTrainNo(id); 
        Log.d("Trainno",Integer.toString(trainObject.getTrainNo())); 
        Log.d("Object2",""+Integer.toString(trainObject.getId())+":"+Integer.toString(trainObject.getTrainNo())+":"+trainObject.getTrainName()); 
       } 
      } 
     } 
     return results; 
    }//End of ProcessXml Function 
} 

Der Code für TrainObject.java Klasse wird wie folgt

package xml_parsing_slidev2.ats.com.xml_parsing_slidev2; 
    public class TrainObject 
    { 
    int id; 
    int TrainNo; 
String TrainName; 
public int getId() 
{ 
    return id; 
} 

public void setId(int id) 
{ 
    this.id = id; 
} 

public int getTrainNo() 
{ 
    return TrainNo; 
} 

public void setTrainNo(int trainno) 
{ 
    this.TrainNo = trainno; 
} 

public String getTrainName() 
{ 
    return TrainName; 
} 

public void setTrainName(String trainName) 
{ 
    this.TrainName = trainName; 
} 
    } 

Dieser Code funktioniert gut, wenn ich bin Zugriff auf die Werte von trainno und Namen in ihrer eigenen, wenn Blöcke, aber wenn ich die gemeinsam zugreifen, wie ich mit Anweisung

zuzugreifen versucht
Log.d("Object2",""+Integer.toString(trainObject.getId())+":"+ 
    Integer.toString(trainObject.getTrainNo())+":"+trainObject.getTrainName()); 

es nur Trainno zeigt und Zugname nicht eher zeigen, ist es Nullwert zeigt

Bitte führen Sie mich, wie ich alle Werte auf einmal bekommen kann, so dass ich sie an meine AutoCompleteTextView übergeben kann. Danke

Antwort

0

Erster Fehler: Sie erstellen das TrainObject in jeder Iteration auf den Feldern erneut. Die Instanz der vorherigen Iteration ist also verloren. Erstellen Sie es vor der J-Schleife:

 TrainObject trainObject=new TrainObject(); 
     for(int j=0;j<ItemChildren.getLength();j++) 
     { 
      CurrentChild=ItemChildren.item(j); 

Zweitens: Sie können nicht auf die Bestellung verlassen. In der Tat, wenn ich das Programm ausgeführt habe, wurde das zweite if vor dem ersten ausgeführt. Also wurde die Ausgabe "Object2" gemacht, bevor der Name überhaupt gelesen werden konnte. Wenn Sie eine Ausgabe nach dem Ende der J-Schleife mit allen Feldern hinzufügen (wie im Namen-if), sollten Sie alle zugewiesenen Mitglieder sehen.

+0

Danke Heri. Versuchte und arbeitete gut. –

+0

Gern geschehen. Darf ich Sie bitten, die Antwort zu akzeptieren und wahrscheinlich zu verbessern? – Heri

Verwandte Themen