java.net.MalformedURLException: kein Protokoll


173

Ich erhalte eine Java-Ausnahme wie:

java.net.MalformedURLException: no protocol

Mein Programm versucht, eine XML-Zeichenfolge zu analysieren, indem es Folgendes verwendet:

Document dom;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(xml);

Die XML-Zeichenfolge enthält:

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

Irgendwelche Vorschläge, was diesen Fehler verursacht?


Wo genau erhalten Sie diese Fehlermeldung? Während Sie das XML analysieren oder versuchen, es über das Netzwerk zu senden? Es wäre wirklich seltsam, wenn Sie dies beim Parsen erhalten würden.
Jesper

Antworten:


368

Die Dokumentation könnte Ihnen helfen: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Die Methode DocumentBuilder.parse(String)nimmt einen URI und versucht ihn zu öffnen. Wenn Sie den Inhalt direkt angeben möchten, müssen Sie ihm ein InputStreamoder Readerbeispielsweise ein StringReader. ... Willkommen zu den Java-Standard-Indirektionsebenen!

Grundsätzlich :

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

Beachten Sie, dass Sie das FileObjekt direkt übergeben können, wenn Sie Ihr XML aus einer Datei lesen DocumentBuilder.parse().

Nebenbei bemerkt, dies ist ein Muster, auf das Sie in Java häufig stoßen werden. Normalerweise arbeiten die meisten APIs mehr mit Streams als mit Strings. Die Verwendung von Streams bedeutet, dass möglicherweise nicht der gesamte Inhalt gleichzeitig in den Speicher geladen werden muss, was eine gute Idee sein kann!


2
@ Guillaume, dabei bekomme ich document = null. Warum passiert das?
HenioJR

1
Keine Ahnung ohne auf den Code zu schauen. Vielleicht ist Ihre Eingabe ungültig und Sie schlucken irgendwie Ausnahme ...
Guillaume

Die Ausführung dieser Codezeile dauert lange. Wie kann man die Leistung verbessern?
Raj Shah

1
+1 für mich unter der Annahme (dummerweise , natürlich) , dass die String - Parameter an die xml parsen sollte .... Natürlich macht es perfekt Sinn , einen URI zu erwarten statt ....
nterry

@RajShah Sie sollten diese Logik nur beim Start ausführen, daher sollte ein längerer Treffer keine Rolle spielen. Sie sollten die Konfiguration auch nicht sehr oft ändern müssen ....
nterry

24

Versuchen Sie statt db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.