java.net.MalformedURLException: tidak ada protokol

173

Saya mendapatkan pengecualian Java seperti:

java.net.MalformedURLException: no protocol

Program saya mencoba mengurai string XML dengan menggunakan:

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

String XML berisi:

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

Ada saran tentang apa yang menyebabkan kesalahan ini?

JJJ
sumber
Di mana tepatnya Anda mendapatkan pesan kesalahan itu? Saat mem-parsing XML, atau saat mencoba mengirimnya melalui jaringan? Akan sangat aneh jika Anda mendapatkan ini saat parsing.
Jesper
digandakan? stackoverflow.com/questions/964311/…
Fernando Gonzalez Sanchez

Jawaban:

369

Dokumentasi dapat membantu Anda: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Metode ini DocumentBuilder.parse(String)mengambil URI dan mencoba membukanya. Jika Anda ingin langsung memberikan konten, Anda harus memberikannya InputStreamatau Reader, misalnya a StringReader. ... Selamat datang di level tipu daya standar Java!

Pada dasarnya:

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

Perhatikan bahwa jika Anda membaca XML dari file, Anda dapat langsung memberikan Fileobjek DocumentBuilder.parse().

Sebagai catatan, ini adalah pola yang akan Anda temui banyak di Jawa. Biasanya, sebagian besar API bekerja dengan Streams lebih dari dengan Strings. Menggunakan Streaming berarti bahwa secara potensial tidak semua konten harus dimuat dalam memori pada saat yang sama, yang dapat menjadi ide bagus!

Guillaume
sumber
2
@ Guillaume, melakukan itu saya mendapatkan dokumen = null. Mengapa ini terjadi?
HenioJR
1
Tidak tahu tanpa melihat kode. Mungkin input Anda tidak valid dan Anda menelan pengecualian ...
Guillaume
Baris kode ini membutuhkan waktu lama untuk dieksekusi. Adakah cara untuk meningkatkan kinerja?
Raj Shah
1
1 untuk saya mengasumsikan (bodoh, tentu saja) bahwa parameter string seharusnya xml untuk mengurai .... Tentu saja, itu membuat sempurna akal untuk mengharapkan URI bukan ....
nterry
@RajShah Anda hanya harus menjalankan logika ini saat startup, jadi waktu yang lebih besar tidak masalah. Anda seharusnya tidak perlu mengubah konfigurasi terlalu sering, baik ....
nterry
24

Coba alih-alih db.parse(xml):

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