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

다음과 같은 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";

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



답변

설명서가 도움이 될 수 있습니다. 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는 문자열보다 스트림에서 더 많이 작동합니다. 스트림을 사용한다는 것은 잠재적으로 모든 콘텐츠를 동시에 메모리에로드 할 필요는 없다는 것을 의미합니다.


답변

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

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


답변