【问题标题】:java.net.MalformedURLException: no protocoljava.net.MalformedURLException:没有协议
【发布时间】:2010-12-14 22:58:42
【问题描述】:

我收到 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 时,还是在尝试通过网络发送时?如果你在解析的时候得到这个,那就太奇怪了。

标签: java xml exception


【解决方案1】:

文档可以帮助你: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 比使用 Strings 更多。使用 Streams 意味着可能不必同时将所有内容加载到内存中,这可能是个好主意!

【讨论】:

  • @Guillaume,这样做我得到 document = null。为什么会发生这种情况?
  • 不看代码就不知道了。也许您的输入无效,并且您以某种方式吞下了异常...
  • 这行代码需要很长时间才能执行。有什么方法可以提高性能?
  • +1 对我来说假设(当然是愚蠢的)字符串参数应该由 xml 解析...。当然,期望 完美 有意义一个 URI 代替....
  • @RajShah 你应该只在启动时运行这个逻辑,所以更大的时间命中应该无关紧要。您也不应该经常更改配置......
【解决方案2】:

尝试代替db.parse(xml)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2014-05-26
    • 2014-02-24
    • 2011-11-22
    • 2018-11-08
    • 1970-01-01
    相关资源
    最近更新 更多