java.net.MalformedURLException:没有协议


173

我收到类似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";

关于造成此错误的原因有什么建议吗?


您到底从哪里得到该错误消息?在解析XML或尝试通过网络发送XML时?如果您在解析时得到此消息,那将真的很奇怪。
杰斯珀,

Answers:


369

该文档可以为您提供帮助: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的协作更多。使用Streams意味着可能并非必须同时将所有内容都加载到内存中,这可能是个好主意!


2
@Guillaume,这样做我得到document = null。为什么会这样?
HenioJR 2014年

1
不看代码就不知道。也许您的输入无效,并且以某种方式吞下了异常……
Guillaume14年

这行代码需要很长时间才能执行。有什么方法可以改善效能吗?
拉杰·沙

1
对我而言,+ 1(当然是愚蠢的)假定应该将字符串参数解析为xml...。当然,完全可以期望使用URI ....
nterry '16

@RajShah您应该只在启动时运行此逻辑,因此更长的时间无关紧要。您也不必经常更改配置
。...– nterry

24

尝试代替db.parse(xml)

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.