【问题标题】:I am trying to parse XML from URL but it just shows me only first 3 elements not all我正在尝试从 URL 解析 XML,但它只显示前 3 个元素而不是全部
【发布时间】:2019-02-03 09:10:25
【问题描述】:

我正在尝试解析此网址 http://rssmix.com/u/8304287/rss.xml

我已经尝试过从一个网站获得的这段代码,它在他们自己的链接上运行良好,但是当我在我的链接上尝试它时,它只显示了前 3 个元素的结果。我想解析整个 XML,但我不知道错误可能在 for 循环中,或者请帮忙。谢谢。

public class MainActivity extends AppCompatActivity {




    // Declare variables
    TextView textview;
    NodeList nodelist;
    ProgressDialog pDialog;
    // Insert image URL
    String URL = "http://rssmix.com/u/8304287/rss.xml";

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

        // Locate a TextView in your activity_main.xml layout
        textview = (TextView) findViewById(R.id.text);
        // Execute DownloadXML AsyncTask
        new DownloadXML().execute(URL);
    }

    // DownloadXML AsyncTask
    private class DownloadXML extends AsyncTask<String, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressbar
            pDialog = new ProgressDialog(MainActivity.this);
            // Set progressbar title
            pDialog.setTitle("Android Simple XML Parsing using DOM Tutorial");
            // Set progressbar message
            pDialog.setMessage("Loading...");
            pDialog.setIndeterminate(false);
            // Show progressbar
            pDialog.show();
        }

        @Override
        protected Void doInBackground(String... Url) {
            try {
                URL url = new URL(Url[0]);
                DocumentBuilderFactory dbf = DocumentBuilderFactory
                        .newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                // Download the XML file
                Document doc = db.parse(new InputSource(url.openStream()));
             //   doc.getDocumentElement();
                // Locate the Tag Name
                nodelist = doc.getElementsByTagName("channel");
                Log.v("BIGASS",doc.toString());




            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;

        }

        @Override
        protected void onPostExecute(Void args) {

            for (int temp = 0; temp < nodelist.getLength(); temp++) {
                Node nNode = nodelist.item(temp);

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;

                    // Set the texts into TextViews from item nodes
                    // Get the title
                    textview.setText(textview.getText() + "Title : "
                            + getNode("title", eElement) + "\n" + "\n");
                    // Get the description
                    textview.setText(textview.getText() + "Description : "
                            + getNode("description", eElement) + "\n" + "\n");
                    // Get the link
                    textview.setText(textview.getText() + "Link : "
                            + getNode("link", eElement) + "\n" + "\n");
                    // Get the date

                }
            }
            // Close progressbar
            pDialog.dismiss();
        }
    }

    // getNode function
    private static String getNode(String sTag, Element eElement) {
        NodeList nlList = eElement.getElementsByTagName(sTag).item(0)
                .getChildNodes();
        Node nValue = (Node) nlList.item(0);
        return nValue.getNodeValue();
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

    在你的xml中,当你执行时,结果只有一个通道标签

    nodelist = doc.getElementsByTagName("channel");
    

    你只会得到一个元素。 我的理解是你想要一个所有项目的列表,为此你应该做类似

    items = channelNode.getElementsByTagName("item");
    

    在你的 for 循环中。 你的 doPost 方法看起来像这样

    @Override
            protected void onPostExecute(Void args) {
    
                for (int temp = 0; temp < nodelist.getLength(); temp++) {
                    Node nNode = nodelist.item(temp);// This will be your channel node
    
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
    //here call 
    List<Elements> items=eElement.getElementsByTagName("item") //This is give list of all items
                        //loop over the items and parse title,description and link.
    
                    }
                }
    

    【讨论】:

    • 当我将它更改为项目时,它会因为说我正在访问一个空值而崩溃。
    • java.lang.NullPointerException:尝试在 indusapps.pakistaninews.MainActivity$DownloadXML.onPostExecute(MainActivity) 的空对象引用上调用接口方法“int org.w3c.dom.NodeList.getLength()” .java:112) 在 indusapps.pakistaninews.MainActivity$DownloadXML.onPostExecute(MainActivity.java:68)
    • 你需要调用 getElementsByTagName("item");在通道节点上。
    • 你能准确地告诉我我应该在哪里称呼这个吗?我不明白通道节点在那个 XML 的东西中对不起位菜鸟在哪里。
    • 编辑了答案,请检查您现在是否理解
    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多