如何将 inputsource 转换为 inputstream 并将其作为参数提供给 stringreader?

Posted

技术标签:

【中文标题】如何将 inputsource 转换为 inputstream 并将其作为参数提供给 stringreader?【英文标题】:How to convert inputsource to inputstream which will feed to stringreader as the parameter? 【发布时间】: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();
        

请在这方面帮助我。

【问题讨论】:

【参考方案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)

以上是关于如何将 inputsource 转换为 inputstream 并将其作为参数提供给 stringreader?的主要内容,如果未能解决你的问题,请参考以下文章

如何将此功能转换为nodejs [关闭]

如何使用 input[type="submit"] 属性将 CSS 转换为 Styled-Components?

避免在 Java 中使用 XPath 重复实例化 InputSource

如何使用 FLTK 将 const char* 转换为 CLR/C++ 中的字符串以获得 FL_Input 或其他小部件的值?

Sqoop导出时如何将null转换为0

在C#中,如何将键盘的空输入转换为可空类型的布尔变量?