java.net.MalformedURLException: sin protocolo

173

Recibo una excepción de Java como:

java.net.MalformedURLException: no protocol

Mi programa está tratando de analizar una cadena XML usando:

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

La cadena XML contiene:

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

¿Alguna sugerencia sobre lo que está causando este error?

JJJ
fuente
¿De dónde sacas exactamente ese mensaje de error? ¿Mientras analiza el XML o intenta enviarlo a través de la red? Sería realmente extraño si obtienes esto mientras analizas.
Jesper
duplicado? stackoverflow.com/questions/964311/…
Fernando Gonzalez Sanchez

Respuestas:

369

La documentación podría ayudarlo: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

El método DocumentBuilder.parse(String)toma un URI e intenta abrirlo. Si desea dar directamente el contenido, debe darle un InputStreamo Reader, por ejemplo, un StringReader. ... ¡Bienvenido a los niveles estándar de indirecciones de Java!

Básicamente :

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

Tenga en cuenta que si lee su XML de un archivo, puede darle directamente el Fileobjeto DocumentBuilder.parse().

Como nota al margen, este es un patrón que encontrarás mucho en Java. Por lo general, la mayoría de las API funcionan más con Streams que con Strings. Usar Streams significa que potencialmente no todo el contenido tiene que cargarse en la memoria al mismo tiempo, ¡lo cual puede ser una gran idea!

Guillaume
fuente
2
@Guillaume, haciendo eso obtengo document = null. ¿Por qué pasó esto?
HenioJR
1
No tengo idea sin mirar el código. Tal vez su entrada no es válida y se traga la excepción de alguna manera ...
Guillaume
Esta línea de código tarda mucho tiempo en ejecutarse. ¿Alguna forma de mejorar el rendimiento?
Raj Shah
1
1 para mí asumir (tontos, por supuesto) que el parámetro de cadena se suponía que el XML para analizar .... Por supuesto, hace perfecto sentido esperar un URI en lugar ....
nterry
@RajShah Solo debe ejecutar esta lógica al inicio, por lo que un golpe de tiempo mayor no debería importar. No debería tener que cambiar la configuración muy a menudo, tampoco ...
nterry
24

Prueba en lugar de db.parse(xml):

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