java.net.MalformedURLException: brak protokołu

173

Otrzymuję wyjątek Java, taki jak:

java.net.MalformedURLException: no protocol

Mój program próbuje przeanalizować ciąg XML przy użyciu:

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

Ciąg XML zawiera:

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

Jakieś sugestie dotyczące przyczyny tego błędu?

JJJ
źródło
Gdzie dokładnie otrzymujesz ten komunikat o błędzie? Podczas analizowania XML lub podczas próby wysłania go przez sieć? Byłoby naprawdę dziwne, gdybyś otrzymał to podczas analizowania.
Jesper
zduplikowane? stackoverflow.com/questions/964311/…
Fernando Gonzalez Sanchez

Odpowiedzi:

369

Dokumentacja może Ci pomóc: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Metoda DocumentBuilder.parse(String)przyjmuje identyfikator URI i próbuje go otworzyć. Jeśli chcesz bezpośrednio podać treść, musisz nadać jej InputStreamlub Reader, na przykład, a StringReader. ... Witamy na standardowych poziomach pośrednich Java!

Zasadniczo:

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

Zauważ, że jeśli odczytujesz XML z pliku, możesz bezpośrednio przekazać Fileobiekt DocumentBuilder.parse().

Na marginesie, jest to wzorzec, który można spotkać w Javie. Zwykle większość interfejsów API działa bardziej ze strumieniami niż ze znakami. Korzystanie ze strumieni oznacza, że ​​potencjalnie nie wszystkie treści muszą być ładowane do pamięci w tym samym czasie, co może być świetnym pomysłem!

Guillaume
źródło
2
@Guillaume, robiąc to, otrzymuję document = null. Dlaczego to się dzieje?
HenioJR
1
Nie ma pomysłu bez spojrzenia na kod. Może twoje dane wejściowe są nieprawidłowe i jakoś przełkniesz wyjątek ...
Guillaume
Wykonanie tej linii kodu zajmuje dużo czasu. Jakiś sposób na poprawę wydajności?
Raj Shah
1
+1 dla mnie zakładając (głupio, oczywiście), że parametr ciąg miała xml do analizowania .... Oczywiście, to sprawia, że doskonały sens oczekiwać URI zamiast ....
nterry
@RajShah Powinieneś uruchamiać tę logikę tylko podczas uruchamiania, więc większy czas nie powinien mieć znaczenia. Nie powinieneś też zbyt często zmieniać konfiguracji ....
nterry
24

Spróbuj zamiast db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Shyam_coder
źródło