java.net.MalformedURLException:无协议:XML
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23027382/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.net.MalformedURLException: no protocol: XML
提问by user2741620
I am trying to output an XML String into a .xml file for debugging purpose. My String looks like this:
我正在尝试将 XML 字符串输出到 .xml 文件中以进行调试。我的字符串看起来像这样:
System.out.println("xmlString = \n" + xmlString);
===========================================================
INFO: xmlString =
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
<lst name="params">
<str name="indent">true</str>
<str name="q">source_t:ST</str>
<str name="wt">xml</str>
</lst>
</lst>
...
Now, the following code is to output the String into XML file.
现在,下面的代码是将字符串输出到 XML 文件中。
try {
System.out.println("Writing xmlString to xml file");
File file = new File("xmlString.xml");
// 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(xmlString);
bw.close();
System.out.println("Done writing file");
} catch (IOException e) {
e.printStackTrace();
}
But this is the error I got from output log:
但这是我从输出日志中得到的错误:
INFO: Writing xmlString to xml file
INFO: Done writing file
SEVERE: java.net.MalformedURLException: no protocol: <?xml version="1.0" encoding="UTF-8"?>
No file is created. Can someone tell me what does this mean? And how to solve this? Thanks in advance
没有创建文件。有人能告诉我这是什么意思吗?以及如何解决这个问题?提前致谢
====================================================================================== Edit (I initially though that the error lies at the FileWritter, which is why I didn't post the whole code): I have edited my post to display my whole code. This code is actually called by a JSP file. Which passes the xmlString
================================================== ==================================== 编辑(我最初认为错误在于 FileWritter,这就是我没有发布整个代码的原因):我编辑了我的帖子以显示我的整个代码。这段代码实际上是由一个 JSP 文件调用的。哪个通过 xmlString
public class SAXParserClass {
//Declare as public since it needs to be redefined for appending into ArrayList
public static String row[] = new String[5]; //id, full_message_t, source_t, news_t, link_t
public ArrayList<String[]> XMLReader(String xmlString)
{
//Output: GlassFish Server. Test if String is passed in correctly
System.out.println("xmlString = \n" + xmlString);
try {
System.out.println("Writing xmlString to xml file");
File file = new File("xmlString.xml");
// 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(xmlString);
bw.close();
System.out.println("Done writing file");
} catch (IOException e) {
e.printStackTrace();
}
//Declaration
final ArrayList<String[]> tableResult = new ArrayList<String[]>(); //Store ArrayList of row[]
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler()
{
//When these are TRUE, extract the content
boolean b_id = false;
boolean b_full_message_t = false;
boolean b_source_t = false;
boolean b_news_t = false;
boolean b_link_t = false;
//############################################################################################
//Look for <start> tags
public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {
System.out.println("Start Element :" + qName);
//Only interested in <str>
if (qName.equalsIgnoreCase("str")) {
String name = attributes.getValue("name");
//Check for name="id"
if(name.equalsIgnoreCase("id")){
b_id = true;
}
//Check for name="full_message_t"
else if(name.equalsIgnoreCase("full_message_t")){
b_full_message_t = true;
}
else if(name.equalsIgnoreCase("source_t")){
b_source_t = true;
}
else if(name.equalsIgnoreCase("news_t")){
b_news_t= true;
}
else if(name.equalsIgnoreCase("link_t")){
b_link_t = true;
}
}//end if
}//end startElement
//############################################################################################
//Look for <end> tags
public void endElement(String uri, String localName,
String qName) throws SAXException {
System.out.println("End Element :" + qName);
//When reach </doc>, row Array is complete. Add into ArrayList
if (qName.equalsIgnoreCase("doc")) {
System.out.println("Push row into Arraylist : " + row[0]);
tableResult.add(row);
row = new String[5]; //reinitialize String[]
}
}//end endElement
//############################################################################################
//Get the content
public void characters(char ch[], int start, int length) throws SAXException {
if (b_id) {
//System.out.println("id : " + new String(ch, start, length));
row[0] = new String(ch, start, length);
System.out.println("The id is " + row[0]);
b_id = false;
}
else if (b_full_message_t) {
//System.out.println("fullmsg : " + new String(ch, start, length));
row[1] = new String(ch, start, length);
System.out.println("The fullmsg is " + row[1]);
b_full_message_t = false;
}
else if (b_source_t) {
//System.out.println("fullmsg : " + new String(ch, start, length));
row[2] = new String(ch, start, length);
System.out.println("The source is " + row[2]);
b_source_t = false;
}
else if (b_news_t) {
//System.out.println("fullmsg : " + new String(ch, start, length));
row[3] = new String(ch, start, length);
System.out.println("The news is " + row[3]);
b_news_t = false;
}
else if (b_link_t) {
//System.out.println("fullmsg : " + new String(ch, start, length));
row[4] = new String(ch, start, length);
System.out.println("The link is " + row[4]);
b_link_t = false;
}
}//end characters
};//end DefaultHandler
//############################################################################################
//Read the String
//saxParser.parse("solrTest.xml", handler);
//File file = new File("solrTest.xml");
//InputStream inputStream= new FileInputStream(file);
// Reader reader = new InputStreamReader(xmlString,"UTF-8");
//
// InputSource is = new InputSource(reader);
// is.setEncoding("UTF-8");
saxParser.parse(xmlString, handler);
} catch (Exception e) {
e.printStackTrace();
}
//Test output Arraylist
System.out.println("Test Result!!!");
for(String[] columns : tableResult){
for(int i=0; i<columns.length; i++){
System.out.println("Number = " + columns[i]);
}
}
//Return the ArrayList of String[]
return tableResult;
}//end XMLReader
}//end class
回答by user207421
saxParser.parse(xmlString, handler);
saxParser.parse(xmlString, handler);
The problem is here. You are passing the XML string as though it was a URL. It isn't. You need to read the Javadoc for SAXParser.parse().
问题就在这里。您正在传递 XML 字符串,就好像它是一个 URL。不是。您需要阅读 SAXParser.parse() 的 Javadoc。
Note:
笔记:
- You posted the wrong code. The stack trace told you where the exception was thrown from. You evidently didn't even look at it.
- You failed to answer questions when they were asked.
- You asked irrelevant questions.
- You denied doing the very thing that caused the problem, afterit was suggested that's what you must be doing. So you didn't even check.
- 你贴错了代码。堆栈跟踪告诉您异常是从哪里抛出的。显然你连看都没看。
- 当他们被问到问题时,你没有回答。
- 你问了无关紧要的问题。
- 在有人建议这是你必须做的事情之后,你否认做了导致问题的事情。所以你甚至没有检查。
This is not a rational strategy for solving problems.
这不是解决问题的合理策略。