java.net.MalformedURLException: нет протокола

128

Я получаю исключение 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";

Любые предложения о том, что вызывает эту ошибку?

  • 0
    Где именно вы получаете это сообщение об ошибке? Во время анализа XML или при попытке отправить его по сети? Было бы очень странно, если бы вы получили это при разборе.
Теги:
exception

2 ответа

294

Документация может помочь вам: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Метод DocumentBuilder.parse(String) принимает URI и пытается его открыть. Если вы хотите напрямую предоставить контент, вы должны дать ему InputStream, например a ByteArrayInputStream.... Добро пожаловать на стандартные уровни безопасности Java!

В основном:

DocumentBuilder db = ...;
String xml = ...;
db.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8"))));

Обратите внимание: если вы читаете XML файл из файла, вы можете напрямую передать объект File DocumentBuilder.parse().

В качестве побочного примечания, это шаблон, с которым вы столкнетесь много на Java. Обычно большинство API работают с Streams больше, чем с помощью Strings. Использование Streams означает, что потенциально не все содержимое должно быть загружено в память одновременно, что может быть отличной идеей!

  • 9
    +1 за стандартные уровни Java
  • 1
    @Guillaume, делая это, я получаю document = null. Почему это происходит?
Показать ещё 4 комментария
14

Попробуйте вместо db.parse(xml):

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню