views:

263

answers:

1

Im getting Java exception like: java.net.MalformedURLException: no protocol

My program trying to parse XML string by using

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

The XML string contains:

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
 " <s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"&gt;"+
 "  <s:Header>"+
 "   <ActivityId CorrelationId=\"15424263-3c01-4709-bec3-740d1ab15a38\" xmlns=\"http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics\"&gt;50d69ff9-8cf3-4c20-afe5-63a9047348ad&lt;/ActivityId&gt;"+
 "   <clalLog_CorrelationId xmlns=\"http://clalbit.co.il/clallog\"&gt;eb791540-ad6d-48a3-914d-d74f57d88179&lt;/clalLog_CorrelationId&gt;"+
 "  </s:Header>"+
 "  <s:Body>"+
 "   <ValidatePwdAndIPResponse xmlns=\"http://tempuri.org/\"&gt;"+
 "   <ValidatePwdAndIPResult xmlns:a=\"http://schemas.datacontract.org/2004/07/ClalBit.ClalnetMediator.Contracts\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"&gt;"+
 "   <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";

Any suggestion why the error cause?

Thank you,

+5  A: 

The documentation could help you : http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

The method DocumentBuilder.parse(String) take a URI and tries to open it. I you want to directly give the content, you have to give it an InputStream, for example a ByteArrayInputStream. ... Welcome to the Java standard levels of indirections !

Basically :

DocumentBuilder db = ...;
String xml = ...;
db.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8"))));

Note that if you read your XML from a file, you can directly give the File object to DocumentBuilder.parse().

As a side note, this is a pattern you will encounter a lot in Java. Usually, most API work with Streams more than with Strings. Using Streams means that potentially not all the content has to be loaded in memory at the same time, which can be a great idea !

Guillaume