java.net.MalformedURLException: no protocol

JavaXmlException

Java Problem Overview


I am getting Java exception like:

java.net.MalformedURLException: no protocol

My program is trying to parse an 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/\">"+
	"		<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";

Any suggestions about what is causing this error?

Java Solutions


Solution 1 - Java

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) takes a URI and tries to open it. If you want to directly give the content, you have to give it an InputStream or Reader, for example a StringReader. ... Welcome to the Java standard levels of indirections !

Basically :

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

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 !

Solution 2 - Java

Try instead of db.parse(xml):

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser206641View Question on Stackoverflow
Solution 1 - JavaGuillaumeView Answer on Stackoverflow
Solution 2 - JavaShyam_coderView Answer on Stackoverflow