android DOM解析标签中的实体

时间:2011-02-16 14:21:56

标签: android xml dom xml-parsing

我可能想要解析包含委托的以下XML。

<node>
    <text><title>foo fo &lt;BR&gt;bar bar </title></text>
</node>

解析有效。但在委托之后我没有收到任何输出。在该位置无法使用CDATA。

我正在使用以下代码:

        urlConnection.getInputStream());
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setExpandEntityReferences(false);
        DocumentBuilder builder = factory.newDocumentBuilder();
        doc = builder.parse(in);

有没有人有个主意?

提前谢谢!

3 个答案:

答案 0 :(得分:0)

永远不需要CDATA使用;所以这既不是问题也不是解决方案。但是你怎么知道没有文字呢?您很可能只有多个相邻的文本节点 - 底层解析器通常返回多个文本段(特别是当有实体时)。您可以使用DOM方法“规范化”Element包含的文本内容,以仅使用单个文本节点替换相邻的Text节点。但如果没有这个,你永远不应该假设所有文本都在第一个(也是唯一的)Text节点内。

如果没有节点,解析器Android捆绑包可能是错误的。我认为它们包含旧版本的xpp或其他东西,它可能有问题(与Xerces或Woodstox等更优雅的解析器相比)。但我首先要确保它不仅仅是“隐藏”节点的情况。

答案 1 :(得分:0)

http://code.google.com/p/android/issues/detail?id=2607

我发现,其他人也有类似的问题。 Android 2.0.1和2.1中有Bug。我通过使用sax解析器解决了这个问题。

答案 2 :(得分:0)

我的名字是Divy Dhiman我是一名高级Android开发人员

我已经通过实体或节点aur通过获取依赖于你的文字控制来完成XML解析。

私有类MyAsyncTask扩展了AsyncTask     {

    @Override
    protected String doInBackground(String... abc) {

        try {

            URL url = new URL(jksbvlds);

            URLConnection connection;
            connection = url.openConnection();

            HttpURLConnection httpConnection = (HttpURLConnection) connection;
             int responseCode = httpConnection.getResponseCode();
             if(responseCode == HttpURLConnection.HTTP_OK)
             {

                 InputStream in = httpConnection.getInputStream();
                 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                 DocumentBuilder db = dbf.newDocumentBuilder();
                 Document dom = db.parse(in);

                 Element docEle = dom.getDocumentElement();
                 NodeList nl = docEle.getElementsByTagName("quote");
                 if(nl != null && nl.getLength()>0)
                 {
                     for(int i = 0; i<nl.getLength();i++ )
                     {
                         StockInfo theStock = getStockInformation(docEle);


                         name = theStock.getName();
                         yearLow = theStock.getYearLow();
                         yearHigh = theStock.getYearHigh();
                         daysLow = theStock.getDaysLow();
                         daysHigh = theStock.getDaysHigh();
                         lastTradePriceonly = theStock.getLastTradePriceonly();
                         change = theStock.getChange();
                         daysRange = theStock.getDaysRange();

                     }
                 }



             }

        } 

        catch(MalformedURLException e)
        {
            Log.d(TAG,"MalformedURLException",e);
        }
        catch(IOException e)
        {
            Log.d(TAG,"IOException",e);
        }
        catch (ParserConfigurationException e) {
            Log.d(TAG,"ParserConfigurationException", e);
            }
        catch (SAXException e) {
            Log.d(TAG,"SAXException",e);

        }
        finally{}

        return null;