java.net.MalformedURLException: không có giao thức


173

Tôi nhận được ngoại lệ Java như:

java.net.MalformedURLException: no protocol

Chương trình của tôi đang cố phân tích một chuỗi XML bằng cách sử dụng:

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

Chuỗi XML chứa:

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

Bất kỳ đề xuất về những gì gây ra lỗi này?


Chính xác thì bạn nhận được thông báo lỗi đó ở đâu? Trong khi phân tích cú pháp XML hoặc trong khi cố gắng gửi nó qua mạng? Sẽ thực sự kỳ lạ nếu bạn nhận được điều này trong khi phân tích cú pháp.
Jesper

Câu trả lời:


368

Tài liệu này có thể giúp bạn: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

Phương thức DocumentBuilder.parse(String)lấy một URI và cố gắng mở nó. Nếu bạn muốn trực tiếp đưa ra nội dung, bạn phải cung cấp cho nó InputStreamhoặc Reader, ví dụ a StringReader. ... Chào mừng bạn đến với các mức độ tiêu chuẩn của Java!

Về cơ bản :

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

Lưu ý rằng nếu bạn đọc XML của mình từ một tệp, bạn có thể trực tiếp cung cấp cho Fileđối tượng DocumentBuilder.parse().

Như một lưu ý phụ, đây là một mẫu bạn sẽ gặp rất nhiều trong Java. Thông thường, hầu hết các API hoạt động với Luồng nhiều hơn với Chuỗi. Sử dụng Luồng có nghĩa là có khả năng không phải tất cả nội dung phải được tải vào bộ nhớ cùng một lúc, đó có thể là một ý tưởng tuyệt vời!


2
@Guillaume, làm điều đó tôi nhận được tài liệu = null. Lý do tại sao điều này xảy ra?
HenioJR

1
Không có ý tưởng mà không nhìn vào mã. Có thể đầu vào của bạn không hợp lệ và bạn nuốt ngoại lệ bằng cách nào đó ...
Guillaume

Dòng mã này mất nhiều thời gian để thực thi. Bất kỳ cách nào để cải thiện hiệu suất?
Raj Shah

1
+1 đối với tôi giả sử (dĩ nhiên là dại dột) rằng tham số chuỗi được cho là xml để phân tích .... Tất nhiên, sẽ rất hợp lý khi mong đợi một URI thay thế ....
nterry

@RajShah Bạn chỉ nên chạy logic này khi khởi động, vì vậy thời gian lớn hơn không nên quan trọng. Bạn không cần phải thay đổi cấu hình rất thường xuyên, ....
nterry

24

Hãy thử thay vì db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.