繁体   English   中英

Android:解析XML文件,但无法通过类对象访问多个元素

[英]Android : Parsing XML file but not getting access to more than one element through class object

我正在解析的xml文件是alltrains.xml如下

    <?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>

MainActivity.java的代码如下

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
}

TrainObject.java类的代码如下

    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;
}
   }

如果我在自己的if块中访问trainno和name的值,但是如果我集体访问那些代码,则该代码可以正常工作,就像我尝试使用statement进行访问

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

它只显示Trainno,不显示火车名称,而是显示空值

请指导我如何一次性获得所有值,以便将其传递给autocompleteTextView。 谢谢

第一个错误:您在字段的每次迭代中都再次创建了trainObject。 因此,之前迭代的实例丢失了。 在j循环之前创建它:

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

第二:您不能依赖订购。 实际上,当我运行程序时,第二个if在第一个执行之前执行。 因此,在甚至可以读取名称之前就完成了输出“ Object2”。 如果在j循环结束后添加所有字段的输出(如name-if),则应该看到所有分配的成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM