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 InputStream
of Reader
geven, 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 File
object 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**)));