java.net.MalformedURLException : 프로토콜 없음


173

다음과 같은 Java 예외가 발생합니다.

java.net.MalformedURLException: no protocol

내 프로그램은 다음을 사용하여 XML 문자열을 구문 분석하려고합니다.

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

XML 문자열에는 다음이 포함됩니다.

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

이 오류의 원인에 대한 제안 사항이 있습니까?


해당 오류 메시지가 정확히 어디서 나타 납니까? XML을 구문 분석하거나 네트워크를 통해 XML을 보내려고 할 때? 파싱하는 동안 이것을 얻는다면 정말 이상 할 것입니다.
Jesper

답변:


369

설명서가 도움이 될 수 있습니다. http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

이 메소드 DocumentBuilder.parse(String)는 URI를 가져 와서 열려고 시도합니다. 컨텐츠를 직접 제공하려면 컨텐츠를 InputStream또는 Reader로 지정해야합니다 (예 : a) StringReader. ... Java 표준 수준의 간접 참조에 오신 것을 환영합니다!

기본적으로 :

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

파일에서 XML을 읽는 경우 File객체에을 (를) 직접 제공 할 수 있습니다 DocumentBuilder.parse().

부수적으로, 이것은 Java에서 많이 접하게 될 패턴입니다. 일반적으로 대부분의 API는 문자열보다 스트림에서 더 많이 작동합니다. 스트림을 사용한다는 것은 잠재적으로 모든 콘텐츠를 동시에 메모리에로드 할 필요는 없다는 것을 의미합니다.


2
@Guillaume, 그렇게하면 document = null이됩니다. 왜 이런 일이 발생합니까?
HenioJR

1
코드를 보지 않고는 모른다. 아마 당신의 입력이 유효하지 않고 어떻게 든 예외를 삼킬 수 있습니다.
Guillaume

이 코드 줄을 실행하는 데 시간이 오래 걸립니다. 성능을 향상시킬 수있는 방법이 있습니까?
Raj Shah

1
문자열 매개 변수를 구문 분석에 XML로 추정되었다 (물론, 어리석게도) 가정 저를위한 일이 .... 물론, 그것은 만드는 완벽한 .... 대신 URI를 기대 감각을
nterry

@RajShah 시작시에만이 로직을 실행해야하므로 더 큰 시간이 걸리지 않아야합니다. 구성을 자주 변경하지 않아도됩니다 ....
nterry

24

대신 사용해보십시오 db.parse(xml):

Document doc = db.parse(new InputSource(new StringReader(**xml**)));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.