如何将输入源转换为输入流,它将作为参数提供给stringreader?

时间:2015-09-28 04:37:54

标签: java android xml parsing inputstream

我有需求,我需要从服务器获取xml,如果它存在,并且如果不从assets文件夹中取出该文件。

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

但是我无法将输入源参数传递给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();
        }

请在这方面帮助我。

2 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:1)

我觉得你很困惑。 XmlPullParser.setInput()方法需要Reader,这就是您需要提供的内容。

在案例1中(来自数据库),您在strFromMbo中有一个字符串,所以只需用StringReader换行。

在案例2(来自档案)中,您有两种选择:

  • 将整个文件作为String加载到内存中。这就是你正在做的事情。
  • 使用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();
    }
}