【问题标题】:XmlPullparser parsing xml from url not workingXmlPullparser 从 url 解析 xml 不起作用
【发布时间】:2018-02-24 08:10:12
【问题描述】:

我正在尝试从 xml 文件填充数据库。它工作得很好,但问题是当我尝试从服务器加载 xml 时。 我花了好几个小时,尝试了很多不同的实现,但我总是收到异常。 这是我当前的代码:

public void populateDB(){
    XmlPullParserFactory pullParserFactory;
    ArrayList<Product> products = null;

    try {
        pullParserFactory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = pullParserFactory.newPullParser();

        InputStream in_s = fContext.getApplicationContext().getAssets().open("products.xml");

        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in_s, null);

        products =  parseXML(parser);

        String text = "";

        for(Product product:products)
        {

            text += "barcode : " + product.getBarcode() + " name : " + product.getName() + "\n";
        }

    } catch (XmlPullParserException e) {

        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    clearTable("products");
    ContentValues values = new ContentValues();
    for(int i = 0; i < products.size(); i++){
        values.clear();
        values.put("barcode", products.get(i).getBarcode());
        values.put("name", products.get(i).getName());
        values.put("itemcode", products.get(i).getItemcode());
        values.put("description", products.get(i).getDescription());

        insertProduct(values);
    }
}

这是 parseXML(),我在其中解析文件并生成产品列表。

private ArrayList<Product> parseXML(XmlPullParser parser) throws XmlPullParserException,IOException
{
    ArrayList<Product> products = null;
    int eventType = parser.getEventType();
    Product product = null;

    while (eventType != XmlPullParser.END_DOCUMENT){
        String name;
        switch (eventType){
            case XmlPullParser.START_DOCUMENT:
                products = new ArrayList();
                break;
            case XmlPullParser.START_TAG:
                name = parser.getName();
                if (name.equals("product")){
                    product = new Product();
                } else if (product != null){
                    if (name.equals("barcode")){
                        product.setBarcode(parser.nextText());
                    } else if (name.equals("name")){
                        product.setName(parser.nextText());
                    } else if (name.equals("itemcode")){
                        product.setItemcode(Integer.parseInt(parser.nextText()));
                    } else if (name.equals("description")){
                        product.setDescription(parser.nextText());
                    }
                }
                break;
            case XmlPullParser.END_TAG:
                name = parser.getName();
                if (name.equalsIgnoreCase("product") && product != null){
                    products.add(product);
                }
        }
        eventType = parser.next();
    }

    return products;

}

现在这仅适用于本地文件,但如果我想从 url 加载它? 我尝试了this线程中给出的解决方案,以及thisthisthisthis,但还是不行。

似乎指令parser.setInput(in_s, null); 不接受包含url 的输入流。

xml文件路径如下:http://cendav.altervista.org/gestione_magazzino/products.xml

【问题讨论】:

  • 那么潜在的问题是如何从 url 中获取 InputStream
  • 不正确,因为我尝试了不同的方法来获取 InputStream,阅读了很多主题,但它从未奏效。所以我不知道问题是InputStream,还是url,还是别的什么。
  • 你的问题是如何解析xml?
  • 不,我可以解析 xml,但我无法从 url 加载它。
  • 什么?你可以解析xml但不能加载url???

标签: java android xml inputstream xmlpullparser


【解决方案1】:

通常我会放入一个 asyncTask:

class getXMLResponseAsyncTask extends AsyncTask<String, Void, Boolean>{

        @Override
        protected void onPreExecute(){
         //do something
        }


        @Override
        public Boolean doInBackground(String... urls) {
            URL url;

            try {
                url = new URL(urls[0]);

                URLConnection connection = url.openConnection();

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document doc = builder.parse(connection.getInputStream());


                NodeList nodes = doc.getElementsByTagName("products");
                for (int i = 0; i < nodes.getLength(); i++) {
                    Element element = (Element) nodes.item(i);
                    NodeList barcode = element.getElementsByTagName("barcode");
                    NodeList name = element.getElementsByTagName("name");
                    NodeList itemcode = element.getElementsByTagName("itemcode");



                    Element barcodeval = (Element) barcode.item(0);
                    Element nameval = (Element) name.item(0);
                    Element itemcodeval = (Element) itemcode.item(0);



                    String BARCODE = barcodeval.getTextContent();
                    String NAME  = nameval.getTextContent();
                    String ITEMCODE = itemcodeval.getTextContent();


                }


            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }

            return false;
        }

        public void onPostExecute(Boolean result) {
        //do something
        }
    }

最后你可以随时使用它

    new getXMLResponseAsyncTask().execute("http://cendav.altervista.org/gestione_magazzino/products.xml");

【讨论】:

  • 这一行DocumentsContract.Document doc = builder.parse((connection.getInputStream())); 给了我不兼容类型的错误。
  • 你导入了import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; 吗?
  • DocumentsContract.Document doc = builder.parse((connection.getInputStream()));不兼容的类型:必需:android.provider.DocumentsConrtact.Document 找到:org.w3c.dom.Document
  • 导入这些:import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;
  • 并确保Document doc = builder.parse(connection.getInputStream());这一行正在使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2016-12-21
相关资源
最近更新 更多