2009-11-10 14 views
131

otrzymuję wyjątek Java jak:java.net.MalformedURLException: brak protokół

java.net.MalformedURLException: no protocol 

Mój program próbuje zanalizować ciąg XML za pomocą:

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?

+0

Gdzie dokładnie się masz, że komunikat o błędzie? Podczas analizowania kodu XML lub podczas próby wysłania go przez sieć? Byłoby naprawdę dziwne, jeśli otrzymasz to podczas analizy. – Jesper

Odpowiedz

283

Dokumentacja mógłby pomóc: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

metody DocumentBuilder.parse(String) zajmuje URI i próbuje go otworzyć. Jeśli chcesz bezpośrednio przekazać zawartość, musisz nadać jej numer InputStream, na przykład ByteArrayInputStream. ... Witamy na standardowych poziomach pośrednich Java!

Zasadniczo:

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

Zauważ, że jeśli czytasz XML z pliku można podać bezpośrednio do obiektu FileDocumentBuilder.parse().

Na marginesie, jest to wzorzec, który można napotkać w Javie. Zwykle większość API współpracuje ze strumieniami bardziej niż ze Strings. Używanie strumieni oznacza, że ​​potencjalnie nie cała zawartość musi być załadowana do pamięci w tym samym czasie, co może być świetnym pomysłem!

+7

+1 dla standardowych poziomów pośrednich java –

+1

@Guillaume, robiąc to otrzymuję dokument = null. Dlaczego to się dzieje? – HenioJR

+0

Nie mam pojęcia bez patrzenia na kod. Może twoje dane wejściowe są nieprawidłowe i jakoś przełamujesz wyjątek ... – Guillaume

18

Spróbuj zamiast db.parse(xml):

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