FlatXmlDataSetBuilder 在使用 StringBuffer 时抛出 "java.net.MalformedURLException"
FlatXmlDataSetBuilder throw "java.net.MalformedURLException" when using a StringBuffer
我正在尝试创建一个解析器,它可以将 XML 数据库提取物解析为 FlatXMLDataSet。
我正在使用 StringBuffer 编写我的 FlatXML,然后将其转换为 FlatXmlDataSet,但它给我一个 "java.net.MalformedURLException : No protocol".
所以我尝试从我的 StringBuffer 创建一个文件并将其解析为 FlatXMLDataSet。它有效!但我真的需要使用 StringBuffer 代替,因为所有内容都必须在内存中使用。
这是我的公寓示例XML :
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<TABLENAME COL1="1"
COL2="35"
/>
</dataset>
这是我使用的代码示例:
// Write the buffer into a file.
writeBuffer(buffer, "D:\test.xml");
// Parse the file into a DataSet.
IDataSet test = createDataSet("D:\test.xml");
// Cast the StringBuffer into an InputSource and give it to
// a FlatXMLDataSetBuider.
InputSource xmlInputStream = new InputSource(buffer.toString());
FlatXmlDataSetBuilder flatXmlBuilder = new FlatXmlDataSetBuilder();
flatXmlBuilder.setColumnSensing(true); // We do not have a dtd to give.
IDataSet dataSet = flatXmlBuilder.build(xmlInputStream); // Error is thrown here
private static void writeBuffer(StringBuffer buffer, String path)
{
try
{
String content = buffer.toString();
File file = new File(path);
// if file doesnt exists, then create it
if (!file.exists())
{
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
}
catch (Exception e)
{
}
}
private static IDataSet createDataSet(String filePath)
{
IDataSet dataSet = null;
try
{
InputStream is = new FileInputStream(filePath);
InputSource xmlInputStream = new InputSource(is);
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setColumnSensing(true);
dataSet = builder.build(xmlInputStream);
}
catch (Exception e)
{
}
return dataSet;
}
我做错了什么?我的意思是,为什么我的 StringBuffer 文件有效,而不是我的 StringBuffer 本身?
问题是 "D:\test.xml" 不是有效的 URL,因为如异常消息所示,它没有指定协议。
正确的字符串应该是 "file:D:\test.xml"(其中 "file:" 是协议)。
经过几个小时的测试,我终于找到了原因:我的 StringBuffer 没有指定任何协议,也没有指定我的 InputSource,所以我的 FlatXmlDataSetBuilder 不知道如何处理我的字符串。
所以我更改了我的 InputSource 声明并且它起作用了:
InputSource xmlInputStream = new InputSource(new ByteArrayInputStream(buffer.toString().getBytes("utf-8")));
我正在尝试创建一个解析器,它可以将 XML 数据库提取物解析为 FlatXMLDataSet。
我正在使用 StringBuffer 编写我的 FlatXML,然后将其转换为 FlatXmlDataSet,但它给我一个 "java.net.MalformedURLException : No protocol".
所以我尝试从我的 StringBuffer 创建一个文件并将其解析为 FlatXMLDataSet。它有效!但我真的需要使用 StringBuffer 代替,因为所有内容都必须在内存中使用。
这是我的公寓示例XML :
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<TABLENAME COL1="1"
COL2="35"
/>
</dataset>
这是我使用的代码示例:
// Write the buffer into a file.
writeBuffer(buffer, "D:\test.xml");
// Parse the file into a DataSet.
IDataSet test = createDataSet("D:\test.xml");
// Cast the StringBuffer into an InputSource and give it to
// a FlatXMLDataSetBuider.
InputSource xmlInputStream = new InputSource(buffer.toString());
FlatXmlDataSetBuilder flatXmlBuilder = new FlatXmlDataSetBuilder();
flatXmlBuilder.setColumnSensing(true); // We do not have a dtd to give.
IDataSet dataSet = flatXmlBuilder.build(xmlInputStream); // Error is thrown here
private static void writeBuffer(StringBuffer buffer, String path)
{
try
{
String content = buffer.toString();
File file = new File(path);
// if file doesnt exists, then create it
if (!file.exists())
{
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
}
catch (Exception e)
{
}
}
private static IDataSet createDataSet(String filePath)
{
IDataSet dataSet = null;
try
{
InputStream is = new FileInputStream(filePath);
InputSource xmlInputStream = new InputSource(is);
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setColumnSensing(true);
dataSet = builder.build(xmlInputStream);
}
catch (Exception e)
{
}
return dataSet;
}
我做错了什么?我的意思是,为什么我的 StringBuffer 文件有效,而不是我的 StringBuffer 本身?
问题是 "D:\test.xml" 不是有效的 URL,因为如异常消息所示,它没有指定协议。
正确的字符串应该是 "file:D:\test.xml"(其中 "file:" 是协议)。
经过几个小时的测试,我终于找到了原因:我的 StringBuffer 没有指定任何协议,也没有指定我的 InputSource,所以我的 FlatXmlDataSetBuilder 不知道如何处理我的字符串。
所以我更改了我的 InputSource 声明并且它起作用了:
InputSource xmlInputStream = new InputSource(new ByteArrayInputStream(buffer.toString().getBytes("utf-8")));