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";

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

JJJ
источник
Где именно вы получаете это сообщение об ошибке? При анализе XML или при попытке отправить его по сети? Было бы очень странно, если бы вы получили это при разборе.
Jesper
дублируется? stackoverflow.com/questions/964311/…
Фернандо Гонсалес Санчес

Ответы:

369

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

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

В принципе :

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

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

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

Гийом
источник
2
@Guillaume, делая это, я получаю document = null. Почему это происходит?
HenioJR
1
Понятия не имею, не глядя на код. Возможно, ваш ввод неверен, и вы как-то проглотили исключение ...
Гийом
Эта строка кода занимает много времени для выполнения. Есть ли способ улучшить производительность?
Радж Шах
1
+1 для меня предполагая (сдуру, конечно) , что параметр строки должен был в XML для синтаксического анализа .... Конечно, это делает идеальный смысл ожидать URI вместо ....
nterry
@RajShah Вы должны запускать эту логику только при запуске, поэтому большее время попадания не имеет значения. Вам не нужно менять конфигурацию слишком часто, либо ....
nterry
24

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

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Shyam_coder
источник