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?


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

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!


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**)));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.