malformedurlexception:没有协议

我得到Java异常像:

java.net.MalformedURLException: no protocol

我的程序试图解析一个XML字符串使用:

Document dom;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(xml);

XML字符串包含:

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
"   <s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
"       <s:Header>"+
"           <ActivityId CorrelationId=\"15424263-3c01-4709-bec3-740d1ab15a38\" xmlns=\"http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics\">50d69ff9-8cf3-4c20-afe5-63a9047348ad</ActivityId>"+
"           <clalLog_CorrelationId xmlns=\"http://clalbit.co.il/clallog\">eb791540-ad6d-48a3-914d-d74f57d88179</clalLog_CorrelationId>"+
"       </s:Header>"+
"       <s:Body>"+
"           <ValidatePwdAndIPResponse xmlns=\"http://tempuri.org/\">"+
"           <ValidatePwdAndIPResult xmlns:a=\"http://schemas.datacontract.org/2004/07/ClalBit.ClalnetMediator.Contracts\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
"           <a:ErrorMessage>Valid User</a:ErrorMessage>"+
"           <a:FullErrorMessage i:nil=\"true\" />"+
"           <a:IsSuccess>true</a:IsSuccess>"+
"           <a:SecurityToken>999993_310661843</a:SecurityToken>"+
"           </ValidatePwdAndIPResult>"+
"           </ValidatePwdAndIPResponse>"+
"       </s:Body>\n"+
"   </s:Envelope>\n";

关于是什么导致这个错误,有什么建议吗?

261746 次浏览

文档可以帮助你:http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

方法DocumentBuilder.parse(String)接受一个URI并尝试打开它。如果你想直接给出内容,你必须给它一个InputStreamReader,例如StringReader. ...欢迎使用Java标准级别的间接指令!

基本上:

DocumentBuilder db = ...;
String xml = ...;
db.parse(new InputSource(new StringReader(xml)));

注意,如果从文件中读取XML,可以直接将File对象赋值给DocumentBuilder.parse()

顺便说一句,这是您在Java中经常遇到的模式。通常,大多数API更多地使用流而不是字符串。使用Streams意味着不需要同时将所有内容加载到内存中,这是个好主意!

尝试代替db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));