2013-09-06 11 views
-2

XML 문서를 구문 분석하는 동안 예외가 발생합니다.java - SAXparserException : 내용이 프롤로그에서 허용되지 않습니다.

나는 herehere과 같은 많은 게시물을 보았습니다. 하지만 여전히 내 문제가 해결되지 않았습니다. 나는 header.I에있는 어떤 공간도 가지고 있지 않다는 것을 검사했다 메모장으로 창조하고 나는 저장하고있는 동안 utf-8로 선택했다.

내 XML 파일은 내가 파일을로드하고 구문 분석을 자바를 사용하고이

<?xml version="1.0" encoding="UTF-8"?> 
<poem> 
<title>Roses are Red</title> 
<l>Roses are red</l> 
</poem> 

것 같습니다. 내 자바 코드는

File xml = new File("d:\\uploads\test.xml"); 
try{ 
    XMLReader xr = XMLReaderFactory.createXMLReader(); 
    MySAXApp handler = new MySAXApp(); 
    xr.setContentHandler(handler); 
    xr.setErrorHandler(handler); 
    FileReader r = new FileReader(xml); 
    xr.parse(new InputSource(r)); 
} 
catch(Exception e) 
{ 
     log.info("Exception : "+e.getMessage()); 
} 

내 MySAXApp 클래스는 다음이 당신의 연결의 첫 번째에 @MikeSokolov에 의해 설명

package utility; 
import java.io.FileReader; 
import java.util.logging.Logger; 
import org.xml.sax.XMLReader; 
import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.helpers.XMLReaderFactory; 
import org.xml.sax.helpers.DefaultHandler; 

public class MySAXApp extends DefaultHandler { 

    public Logger log; 
    public MySAXApp() 
    { 

     super(); 
     log = Logger.getAnonymousLogger(); 
    } 
    public void startDocument() 
    { 
     log.info("Start document"); 
    } 


    public void endDocument() 
    { 
     log.info("End document"); 
    } 
    public void startElement (String uri, String name,String qName, Attributes atts) 
    { 

     log.info("Start element: " + qName); 

    } 

    public void endElement (String uri, String name, String qName) 
    { 
     log.info("End element: " + qName); 
    } 
    public void characters (char ch[], int start, int length) 
    { 
     log.info("values: \""); 
     for (int i = start; i < start + length; i++) { 
      switch (ch[i]) { 
      case '\\': 
      log.info("\\\\"); 
      break; 
      case '"': 
      log.info("\\\""); 
      break; 
      case '\n': 
      log.info("\\n"); 
      break; 
      case '\r': 
      log.info("\\r"); 
      break; 
      case '\t': 
      log.info("\\t"); 
      break; 
      default: 
      log.info(ch[i]+""); 
      break; 
      } 
     } 
     log.info("\"\n"); 
    } 
} 

스택 추적

org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 

    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1411) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1038) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 

    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 

    at utility.PerformOperation.startIndexing(PerformOperation.java:91) 
    at utility.Upload.doPost(Upload.java:126) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 
+0

전체 스택 추적을 붙여 넣을 수 있습니까? catch 블록에서 e.printStackTrace()를 사용하십시오. –

+0

@JoeElleson 게시물을 편집하고 스택 추적을 붙여 넣었습니다 – Shadow

+0

가능한 복제본 [org.xml.sax.SAXParseException : 프롤로그에서 내용을 사용할 수 없습니다] (http://stackoverflow.com)/questions/5138696/org-xml-sax-saxparseexception-content-in-prolog에서 허용되지 않음) – Raedwald

답변

3

입니다. 인용구 :

자주 발생하는 또 다른 일이있는 UTF-8 XML 선언이 공백으로 처리하기 전에 문서가 XML에 문자의 스트림로서 건네 경우 허용되는 BOM (바이트 순서 표시) 파서는 바이트 스트림이 아닙니다. 다음과 같이

FileReader

, 당신은 대신 FileInputStream를 사용한다, 문자 스트림으로 파일을 읽고, 바이트 스트림으로 파일을 읽을 수 :

당신이 헥스에 텍스트 파일을 검사하는 경우
FileInputStream is = new FileInputStream(xml); 
xr.parse(new InputSource(is)); 

편집기에서 시작 부분에 UTF-8 BOM이 표시되고 FileReader을 사용할 때 문제를 일으키는 원인이됩니다.

1

다음 방법을 사용하여 XML 파일을 String으로 읽은 다음 String을 구문 분석 할 수 있습니다. 핵심은 파일을 읽을 때 인코딩을 지정하는 것입니다.

public static void XMLtoString(File file) { 

    String encoding = ""; 
    String str = ""; 

    try { 
     // detect the encoding of the file 
     CharsetDetector cd = new CharsetDetector().setText(new BufferedInputStream(new FileInputStream(file))); 
     encoding = cd.detect().getName(); 

     // to avoid the BOM ("byte order mark") being added to the String, encoding is specified as a parameter 
     str = FileUtils.readFileToString(file, encoding); 
    } 
    catch (IOException e) { 
     System.err.println("Caught IOException: " + e.getMessage()); 
    } 
}