java.net.MalformedURLException: protokol yok


173

Java istisnası gibi alıyorum:

java.net.MalformedURLException: no protocol

Programım kullanarak bir XML dizesini ayrıştırmaya çalışıyor:

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

XML dizesi şunları içerir:

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

Bu hataya neden olanla ilgili herhangi bir öneriniz var mı?


Bu hata mesajını tam olarak nereden alıyorsunuz? XML ayrıştırılırken mi yoksa ağ üzerinden mi gönderilmeye çalışılır? Ayrıştırma sırasında bunu alırsanız gerçekten garip olurdu.
Jesper

Yanıtlar:


369

Belgeler size yardımcı olabilir: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Yöntem DocumentBuilder.parse(String)bir URI alır ve onu açmaya çalışır. İçeriği doğrudan vermek istiyorsanız, bir InputStreamveya Readerörneğin a vermeniz gerekir StringReader. ... Java standart indirme düzeylerine hoş geldiniz!

Temel olarak:

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

XML'inizi bir dosyadan okursanız, Filenesneyi doğrudan verebileceğinizi unutmayın DocumentBuilder.parse().

Bir yan not olarak, bu Java'da çok karşılaşacağınız bir modeldir. Genellikle, çoğu API Strings ile Streams'ten daha fazla çalışır. Akışların kullanılması, potansiyel olarak tüm içeriğin aynı anda belleğe yüklenmesi gerekmediği anlamına gelir, bu da harika bir fikir olabilir!


2
@Guillaume, bunu yaparken belge = null. Bu neden oluyor?
HenioJR

1
Koda bakmadan hiçbir fikrim yok. Belki de girdiniz geçersiz ve bir şekilde istisnayı yutuyorsunuz ...
Guillaume

Bu kod satırının yürütülmesi uzun zaman alıyor. Performansı artırmanın bir yolu var mı?
Raj Shah

1
+1 parametresinin (aptalca, elbette) dize parametresinin
xml'ye

@RajShah Bu mantığı yalnızca başlangıçta çalıştırmalısınız, bu nedenle daha büyük bir zaman isabeti önemli olmamalıdır. Konfigürasyonu da çok sık değiştirmek zorunda
kalmamalısınız

24

Şunun yerine deneyin db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.