【问题标题】:How to convert inputsource to inputstream which will feed to stringreader as the parameter?如何将 inputsource 转换为 inputstream 并将其作为参数提供给 stringreader?
【发布时间】:2015-12-25 06:27:00
【问题描述】:

我有要求,我需要从服务器获取 xml 以解析它是否存在,如果不存在则从 assets 文件夹中获取文件。

我使用 inputstream 获得的 xml 将其作为参数传递给 StringReader 以进行进一步处理。我正在使用 XmlPullParser 进行解析。

但我无法将 inputsource 参数传递给 stringreader 以进行进一步解析。我不使用文档阅读器。请找到下面的代码。

 private void  readSynconfiguration( )
    {

        XmlParser xmlparser = new XmlParser();

            try {
                String strFromMbo = getDataFromMBO();
                if(strFromMbo != null && !strFromMbo.isEmpty()) {   // first
                    InputSource is = new InputSource(new StringReader(strFromMbo));
                   // result = getStringFromInputStream(is);
                }
                else {
                    context = RetailExecutionApplication.getApp().getApplicationContext();
                    InputStream stream = context.getAssets().open("syncSettings.xml");
                    result = getStringFromInputStream(stream);
                }
            } catch (IOException e) {
                syncSetting = false;
                e.printStackTrace();
            }

        StringReader labelReader = new StringReader(result);

        try {
            if(syncSetting) {
                labelSharedInstance.clear();
                labelSyncDetails = xmlparser.LabelsParse(labelReader);
                labelSharedInstance = labelSyncDetails;
            }
        } catch (XmlPullParserException e) {
            syncSetting = false;
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

请在这方面帮助我。

【问题讨论】:

    标签: java android xml parsing inputstream


    【解决方案1】:
    You can not pass inputsorce object directly to StringReader. First of all you convert inputsorce to reader as follows :
    
    Reader reader = yourInputSource.getCharacterStream();
    String result = reader.toString();
    

    StringReader labelReader = new StringReader(result);

    【讨论】:

    • 感谢 USKMobility。我会检查并通知您。
    • 你好 USKMobility,当我修改你上面提到的代码时,整个 xml 没有存储在结果字符串中。它将 JavaStringIO 等内容存储到结果变量
    【解决方案2】:

    我认为你把事情搞糊涂了。 XmlPullParser.setInput() 方法采用 Reader,所以这就是您需要提供的。

    在情况 1(来自数据库)中,strFromMbo 中有一个字符串,所以只需用 StringReader 包装即可。

    在情况 2(来自文件)中,您有两个选择:

    • 将整个文件作为字符串加载到内存中。这就是你正在做的事情。
    • 使用FileReader。使用更少的内存。

    在这两种情况下,请记住关闭您的资源。

    我不明白“输入源”与任何东西有什么关系。

    String xml = getDataFromMBO();
    if (xml == null || xml.isEmpty()) {
        context = RetailExecutionApplication.getApp().getApplicationContext();
        try (InputStream stream = context.getAssets().open("syncSettings.xml")) {
            xml = getStringFromInputStream(stream);
        } catch (IOException e) {
            syncSetting = false;
            e.printStackTrace();
        }
    }
    
    if (syncSetting) {
        try {
            labelSharedInstance.clear();
            labelSyncDetails = new XmlParser().LabelsParse(new StringReader(xml));
            labelSharedInstance = labelSyncDetails;
        } catch (XmlPullParserException e) {
            syncSetting = false;
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 您好 Andreas,只有当我无法从 db 中获取资产时,我才会从资产中获取。这就是我使用输入源的原因
    • 您好 Andreas,当我尝试按照您的建议进行更改时,它给出了一个例外。由于 xml 文件中的空格或下一行,是否会出现这种预期?
    • 这取决于解析实现和异常,您都没有共享。如果您无法弄清楚,我建议您按照以下指南使用相关信息创建一个新问题:How to create a Minimal, Complete, and Verifiable example
    • 感谢 Andreas,异常和逻辑在另一台笔记本电脑中。它崩溃了。很快我就会提供这些细节,请帮我解决这个问题
    • 异常是----> 意外令牌(位置:TEXT\n\n@20:1 in java.io.StringReader@3c88a151)
    猜你喜欢
    • 2013-06-11
    • 2018-12-12
    • 2010-09-08
    • 1970-01-01
    • 2013-07-19
    • 2020-09-28
    • 1970-01-01
    • 2011-04-12
    • 2011-12-12
    相关资源
    最近更新 更多