java.net.MalformedURLException: no protocol

173

Estou recebendo uma exceção Java como:

java.net.MalformedURLException: no protocol

Meu programa está tentando analisar uma string XML usando:

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

A cadeia XML contém:

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

Alguma sugestão sobre o que está causando esse erro?

JJJ
fonte
De onde exatamente você está recebendo essa mensagem de erro? Ao analisar o XML ou ao tentar enviá-lo pela rede? Seria realmente estranho se você conseguir isso enquanto analisa.
Jesper
duplicado? stackoverflow.com/questions/964311/…
Fernando Gonzalez Sanchez

Respostas:

368

A documentação pode ajudá-lo: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

O método DocumentBuilder.parse(String)pega um URI e tenta abri-lo. Se você deseja fornecer diretamente o conteúdo, é necessário fornecer um InputStreamou Reader, por exemplo, a StringReader. ... Bem-vindo aos níveis padrão de indireções Java!

Basicamente:

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

Observe que, se você ler seu XML de um arquivo, poderá atribuir o Fileobjeto diretamente DocumentBuilder.parse().

Como uma observação lateral, este é um padrão que você encontrará muito em Java. Geralmente, a maioria das API trabalha mais com Streams do que com Strings. Usar o Streams significa que, potencialmente, nem todo o conteúdo precisa ser carregado na memória ao mesmo tempo, o que pode ser uma ótima idéia!

Guillaume
fonte
2
@ Guillaume, fazendo isso, recebo document = null. Por que isso acontece?
HenioJR
1
Não faço ideia sem olhar o código. Talvez a sua entrada é inválida e você engolir exceção de alguma forma ...
Guillaume
Essa linha de código leva muito tempo para ser executada. Alguma maneira de melhorar o desempenho?
Raj Shah
1
+1 para mim assumindo (tolamente, é claro) que o parâmetro de cadeia era para o XML para analisar .... Claro, faz perfeito sentido esperar um URI, em vez ....
nterry
@RajShah Você só deve executar essa lógica na inicialização, para que um acerto de tempo maior não importe. Você também não deveria ter que alterar a configuração com muita frequência ...
#
24

Tente em vez de db.parse(xml):

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