java.net.MalformedURLException: ไม่มีโปรโตคอล


173

ฉันได้รับข้อยกเว้น Java เช่น:

java.net.MalformedURLException: no protocol

โปรแกรมของฉันพยายามแยกสตริง XML โดยใช้:

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

สตริง XML ประกอบด้วย:

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

ข้อเสนอแนะใด ๆ เกี่ยวกับสิ่งที่ทำให้เกิดข้อผิดพลาดนี้?


คุณได้รับข้อความแสดงข้อผิดพลาดตรงไหน ขณะแยกวิเคราะห์ XML หรือพยายามส่งผ่านเครือข่าย มันจะแปลกจริงๆถ้าคุณได้รับสิ่งนี้ในขณะที่การแยกวิเคราะห์
Jesper

คำตอบ:


369

เอกสารสามารถช่วยคุณได้: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

วิธีนี้DocumentBuilder.parse(String)ใช้ URI และพยายามเปิด หากคุณต้องการโดยตรงให้เนื้อหาที่คุณต้องให้มันInputStreamหรือตัวอย่างเช่นReader StringReader... ยินดีต้อนรับสู่ระดับมาตรฐานทางอ้อมของ Java!

โดยทั่วไป:

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

โปรดทราบว่าหากคุณอ่าน XML ของคุณจากไฟล์คุณสามารถมอบFileวัตถุให้DocumentBuilder.parse()โดยตรง

นี่คือแพทเทิร์นที่คุณจะพบเจอมากในจาวา โดยปกติแล้ว API ส่วนใหญ่จะทำงานกับ Streams มากกว่า Strings การใช้สตรีมหมายความว่าอาจไม่จำเป็นต้องโหลดเนื้อหาทั้งหมดในหน่วยความจำพร้อมกันซึ่งอาจเป็นแนวคิดที่ยอดเยี่ยม!


2
@ Guillaume โดยที่ฉันได้รับเอกสาร = null ทำไมสิ่งนี้ถึงเกิดขึ้น
HenioJR

1
ไม่มีความคิดหากไม่ดูรหัส บางทีการป้อนข้อมูลของคุณไม่ถูกต้องและคุณกลืนข้อยกเว้นอย่างใด ...
Guillaume

บรรทัดของรหัสนี้ใช้เวลานานในการดำเนินการ มีวิธีใดบ้างในการปรับปรุงประสิทธิภาพ
ราชาชาห์

1
+1 สำหรับฉันสมมติ (โง่เขลาของหลักสูตร) ว่าพารามิเตอร์สตริงก็ควรที่จะ XML เพื่อแยก .... แน่นอนว่ามันทำให้สมบูรณ์แบบความรู้สึกที่จะคาดหวัง URI แทน ....
nterry

@RajShah คุณควรรันตรรกะนี้เมื่อเริ่มต้นเท่านั้นดังนั้นการใช้เวลามากขึ้นจึงไม่สำคัญ คุณไม่ควรจะต้องเปลี่ยนการตั้งค่าบ่อยมากทั้ง ....
nterry

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.