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?
Respuestas:
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 unInputStream
oReader
, por ejemplo, unStringReader
. ... ¡Bienvenido a los niveles estándar de indirecciones de Java!Básicamente :
Tenga en cuenta que si lee su XML de un archivo, puede darle directamente el
File
objetoDocumentBuilder.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!
fuente
Prueba en lugar de
db.parse(xml)
:fuente