如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 input[type="submit"] 属性将 CSS 转换为 Styled-Components?
避免在 Java 中使用 XPath 重复实例化 InputSource
如何使用 FLTK 将 const char* 转换为 CLR/C++ 中的字符串以获得 FL_Input 或其他小部件的值?