【问题标题】:Problems parsing XML from a String but not a file从字符串而不是文件解析 XML 时出现问题
【发布时间】:2011-04-14 11:26:41
【问题描述】:

我有一个 xml 解析器,当我从文件加载它时,它可以完美运行:

private void getParsedXML(int id, Context context) throws Exception {
        /* Get a SAXParser from the SAXPArserFactory. */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();

        /* Get the XMLReader of the SAXParser we created. */
        XMLReader xr = sp.getXMLReader();
        /* Create a new ContentHandler and apply it to the XML-Reader */
        XMLHandlerLevel myExampleHandler = new XMLHandlerLevel();
        xr.setContentHandler(myExampleHandler);
        /* Load xml file from raw folder*/
        InputStream in = context.getResources().openRawResource(id); 

        /* Begin parsing */
        xr.parse(new InputSource(in));
        this.levelData = myExampleHandler.getLevelData();
        in.close();
    }

但现在我也从服务器获取一些内容。然后 XML 作为字符串发送,这就是它阻塞的地方:

private void getParsedXML(String s) throws Exception{
        if(this.levelData == null){
            InputStream in = StringToStream(s);
            /* Get a SAXParser from the SAXPArserFactory. */
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLHandlerLevel myExampleHandler = new XMLHandlerLevel();
            XMLReader xr = sp.getXMLReader();
            /* Begin parsing */
            xr.parse(new InputSource(in));



            this.levelData = myExampleHandler.getLevelData();
            Log.e("jason",(levelData!=null)?levelData.toString():null);
            in.close();
        }
    }

这里是 StringToString 函数

    public static InputStream StringToStream(String text) {
            InputStream is = null;
            /*
             * Convert String to InputStream using ByteArrayInputStream 
             * class. This class constructor takes the string byte array 
             * which can be done by calling the getBytes() method.
             */
            try {
                is = new ByteArrayInputStream(text.getBytes("UTF-8"));
                 is.reset();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (Exception e){
                Log.e("jason","failed again");
            }
            return is;
        }

但这不起作用...

我确定字符串的内容。 我测试了 StringToStream 函数,它工作正常。

我还将日志放入 XMLHandlerLevel 以检查发生了什么,甚至没有调用函数 startDocument(),但我没有收到任何错误消息,也没有异常,所以我完全无法解释这一点。

继续: 当 Stream 来自 context.getResources().openRawResource(id); 时,我的 XMLParser 工作正常; 但不是当它形成一个字符串时 为什么?

感谢您的任何想法

杰森

【问题讨论】:

  • 你的意思是它不起作用?是否抛出异常?
  • 您没有将文本制作成 InputStream,StringReader 会更好。但是传递的代码本质上是一样的——一定还有别的问题吗?在这种情况下,让 parse 方法以这样的方式接收 xml 源代码,使工作代码和非工作代码共享一些逻辑,这样您就可以消除共享代码的问题..
  • @kgiannakakis 没有抛出异常,这是最让我烦恼的。 @Thomas 这已经是我所做的,唯一的区别是在 InputSource 上创建
  • 您似乎没有在接受字符串的代码路径中设置 ContentHandler(请参阅我更新的答案)。
  • @Blaise Doughan:谢谢!我无法相信我对这个有多盲目:S

标签: java android xml inputstream


【解决方案1】:

您似乎没有在接受字符串的代码路径中设置内容处理程序。

为什么不将字符串包装在 StringReader 中并对其进行解析?

InputSource is = new InputSource(new StringReader(string));
xr.parse(is);

你的例子(修改):

private void getParsedXML(String s) throws Exception{
    if(this.levelData == null){
        /* Get a SAXParser from the SAXPArserFactory. */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLHandlerLevel myExampleHandler = new XMLHandlerLevel();
        XMLReader xr = sp.getXMLReader();
        /* Begin parsing */
        InputSource is = new InputSource(new StringReader(string));
        xr.parse(is);

        this.levelData = myExampleHandler.getLevelData();
        Log.e("jason",(levelData!=null)?levelData.toString():null);
        in.close();
    }
}

【讨论】:

    【解决方案2】:

    我不确定它是否会对你有所帮助,但是有一个名为 Jsoup.jar 的外部 jar 文件将它添加到你的项目中,它具有解析 xml、html 的 API ...请参阅互联网上的教程 ....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多