java.net.MalformedURLException: geen protocol

Ik krijg Java-uitzondering zoals:

java.net.MalformedURLException: no protocol

Mijn programma probeert een XML-tekenreeks te ontleden met:

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

De XML-tekenreeks bevat:

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

Suggesties over wat deze fout veroorzaakt?


Antwoord 1, Autoriteit 100%

De documentatie kan u helpen: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/documentbuilder.html

De methode DocumentBuilder.parse(String)Neemt een URI en probeert het te openen. Als u direct de inhoud wilt geven, moet u het een InputStreamof Readergeven, bijvoorbeeld een StringReader. … Welkom bij de Java-standaardniveaus van indirecties!

eigenlijk:

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

Merk op dat als u uw XML uit een bestand leest, u direct de Fileobject kunt geven op DocumentBuilder.parse().

Als een zijkant, is dit een patroon dat je veel tegenkomt in Java. Meestal werken de meeste API met streams meer dan met snaren. Het gebruik van streams betekent dat potentieel niet alle inhoud tegelijkertijd in het geheugen moet worden geladen, wat een geweldig idee kan zijn!


Antwoord 2, Autoriteit 7%

Probeer in plaats van db.parse(xml):

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

Other episodes