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 або при спробі надіслати його по мережі? Було б дійсно дивно, якщо ви отримаєте це під час розбору.
Jesper

Відповіді:


369

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

Метод DocumentBuilder.parse(String)приймає URI і намагається його відкрити. Якщо ви хочете безпосередньо надати вміст, ви повинні надати йому InputStreamабо Reader, наприклад, а StringReader. ... Ласкаво просимо до стандартних рівнів непрямих Java

В основному:

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

Зауважте, що якщо ви читаєте свій XML з файлу, ви можете безпосередньо надати Fileоб'єкт DocumentBuilder.parse().

Як бічна примітка, це шаблон, з яким ви багато зустрінетесь на Java. Зазвичай більшість API більше працюють із Streams, ніж зі Strings. Використання потоків означає, що потенційно не весь вміст має одночасно завантажуватися в пам'ять, що може бути чудовою ідеєю!


2
@Guillaume, завдяки цьому я отримую документ = null. Чому це відбувається?
HenioJR

1
Немає ідеї, не дивлячись на код. Можливо, ваш внесок недійсний, і ви проковтуєте виняток якось ...
Гійом

Цей рядок коду потребує тривалого часу для виконання. Будь-який спосіб покращити продуктивність?
Радж Шах

1
+1 для мене припускаючи (здуру, звичайно) , що параметр рядка повинен був в XML для синтаксичного аналізу .... Звичайно, це робить ідеальний сенс очікувати URI замість ....
nterry

@RajShah Ви повинні запускати цю логіку лише при запуску, тому більший час потрапляння не повинен мати значення. Вам також не доведеться змінювати конфігурацію дуже часто.
nterry

24

Спробуйте замість db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.