2009-11-10 6 views
131

Ich erhalte Java-Ausnahme wie:java.net.MalformedURLException: kein Protokoll

java.net.MalformedURLException: no protocol 

Mein Programm versucht, eine XML-Zeichenfolge zu analysieren, indem Sie:

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 zu dem, was diesen Fehler verursacht?

+0

Wo genau sind Sie, dass Fehlermeldung zu bekommen? Während das XML analysiert wird oder versucht wird, es über das Netzwerk zu senden? Es wäre wirklich seltsam, wenn Sie dies beim Parsen bekommen. – Jesper

Antwort

283

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

Verfahren DocumentBuilder.parse(String) eine URI nimmt und versucht, sie zu öffnen. Wenn Sie den Inhalt direkt angeben möchten, müssen Sie ihm einen InputStream geben, zum Beispiel einen ByteArrayInputStream. ... Willkommen zu den Java-Standard Ebenen der Rückweisungen!

Grundsätzlich gilt:

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

Beachten Sie, dass, wenn Sie Ihre XML-Daten aus einer Datei zu lesen, können Sie direkt die File Objekt DocumentBuilder.parse() geben.

Als eine Randnotiz ist dies ein Muster, das Sie in Java häufig begegnen werden. Normalerweise arbeiten die meisten APIs mit Streams mehr als mit Strings. Die Verwendung von Streams bedeutet, dass möglicherweise nicht alle Inhalte gleichzeitig in den Speicher geladen werden müssen, was eine großartige Idee sein kann!

+7

+1 für Java-Standard Ebenen der Rückweisungen –

+1

@Guillaume, doing, dass ich Dokument = null. Warum passiert das? – HenioJR

+0

Keine Ahnung, ohne auf den Code zu schauen. Vielleicht ist deine Eingabe ungültig und du schluckst die Exception irgendwie ... – Guillaume

18

Versuchen statt db.parse(xml):

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