2013-07-31 2 views
1

아래 클래스에서 작성한 XML 파일을 읽는 데 문제가 있습니다. 올바른 파일 디렉토리가 사용되도록 설정해야하는 속성이 여기에 있다고 믿게되었습니다. "logger.dtd"가 포함 된 줄을 제거하면예외가있는 XMLFile을 읽을 수 없습니다. java.io.FileNotFoundException : C : Temp logger.dtd (시스템에서 지정된 파일을 찾을 수 없음)

<?xml version="1.0" encoding="WINDOWS-1252"?> 
<!DOCTYPE log SYSTEM "logger.dtd"> 

상단에있는 XML 파일을 읽을 수 있습니다. 누군가 일어나는 일을 설명 할 수 있습니까? SAXParser API를 사용하여 설정 한 동일한 URI에서 읽습니다. 내가 "logger.dtd"를 포함하는 행을 제거하면 상단에 읽을 수 있습니다 ... http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

package logging; 

    import java.io.IOException; 
    import java.util.logging.FileHandler; 
    import java.util.logging.Handler; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 

    import java.util.logging.SimpleFormatter; 
    import java.util.logging.XMLFormatter; 

    import javax.xml.parsers.SAXParser; 
    import javax.xml.parsers.SAXParserFactory; 

    import org.xml.sax.Attributes; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.helpers.DefaultHandler; 

    public class Log { 
static private FileHandler fileTxt; 
static private SimpleFormatter formatterTxt; 
static private FileHandler fileXML; 
static private XMLFormatter formatterXML; 



static public void setup(Logger theLogger) throws IOException{ 
    Logger logger = theLogger; 

    logger.setLevel(Level.ALL); 

    fileTxt = new FileHandler("C:\\Temp\\logging.txt"); 
    fileXML = new FileHandler("C:\\Temp\\XMLLogging.xml"); 

    formatterTxt = new SimpleFormatter(); 
    fileTxt.setFormatter(formatterTxt); 
    logger.addHandler(fileTxt); 

    formatterXML = new XMLFormatter(); 
    fileXML.setFormatter(formatterXML); 
    logger.addHandler(fileXML); 

    for(Handler h: logger.getHandlers()){ 
     System.out.println(h.getFormatter()); 
    } 


} 

} 
+0

logger.dtd 파일은 XMLLogging.xml과 같은 디렉토리에 있어야합니다. dtd [here] (http://en.wikipedia.org/wiki/Document_Type_Definition)에 대한 자세한 내용을 볼 수 있습니다. –

+0

그래서 내가 이클립스에서 자신을 생성 뭔가가 무엇입니까? Java에서 로깅 API와 함께 진행되는 자동화 된 프로세스가 있습니까? –

+0

가장 좋은 방법 인 XMLLogging.xml과 동일한 소스에서 DTD를 얻을 수 있다면. 그렇게 할 수 없다면 온라인에 많은 DTD 생성기가 있으며 [Eclipse XML Editor] (http://editorxml.sourceforge.net/)로도 생성 할 수 있습니다. –

답변

-1

: 나는 SAX 여기 구문 분석에 대한 지침을 따랐다. 누군가 일어나는 일을 설명 할 수 있습니까?

SAX 파서의 기본값이 외부 DTD 유효성 검사 및로드이므로 오류가 발생합니다.

SAXParserFactory factory = SAXParserFactory.newInstance(); 
    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    SAXParser saxParser = factory.newSAXParser(); 

SAX가 더 이상 DTD 파일을 찾을 것 및 예외를 찾을 수없는 파일을 던져하지 않습니다 당신이 그렇게하지 않으려면 다음 유효성 검사를 해제합니다.

그렇지 않으면 "logger.dtd"파일은 Java Logging Overview3.0 부록 A : XMLFormatter 출력용 DTD에서 찾을 수 있습니다.

<!-- DTD used by the java.util.logging.XMLFormatter --> 
<!-- This provides an XML formatted log message. --> 

<!-- The document type is "log" which consists of a sequence 
of record elements --> 
<!ELEMENT log (record*)> 

<!-- Each logging call is described by a record element. --> 
<!ELEMENT record (date, millis, sequence, logger?, level, 
class?, method?, thread?, message, key?, catalog?, param*, exception?)> 

<!-- Date and time when LogRecord was created in ISO 8601 format --> 
<!ELEMENT date (#PCDATA)> 

<!-- Time when LogRecord was created in milliseconds since 
midnight January 1st, 1970, UTC. --> 
<!ELEMENT millis (#PCDATA)> 

<!-- Unique sequence number within source VM. --> 
<!ELEMENT sequence (#PCDATA)> 

<!-- Name of source Logger object. --> 
<!ELEMENT logger (#PCDATA)> 

<!-- Logging level, may be either one of the constant 
names from java.util.logging.Level (such as "SEVERE" 
or "WARNING") or an integer value such as "20". --> 
<!ELEMENT level (#PCDATA)> 

<!-- Fully qualified name of class that issued 
logging call, e.g. "javax.marsupial.Wombat". --> 
<!ELEMENT class (#PCDATA)> 

<!-- Name of method that issued logging call. 
It may be either an unqualified method name such as 
"fred" or it may include argument type information 
in parenthesis, for example "fred(int,String)". --> 
<!ELEMENT method (#PCDATA)> 

<!-- Integer thread ID. --> 
<!ELEMENT thread (#PCDATA)> 

<!-- The message element contains the text string of a log message. --> 
<!ELEMENT message (#PCDATA)> 

<!-- If the message string was localized, the key element provides 
the original localization message key. --> 
<!ELEMENT key (#PCDATA)> 

<!-- If the message string was localized, the catalog element provides 
the logger's localization resource bundle name. --> 
<!ELEMENT catalog (#PCDATA)> 

<!-- If the message string was localized, each of the param elements 
provides the String value (obtained using Object.toString()) 
of the corresponding LogRecord parameter. --> 
<!ELEMENT param (#PCDATA)> 

<!-- An exception consists of an optional message string followed 
by a series of StackFrames. Exception elements are used 
for Java exceptions and other java Throwables. --> 
<!ELEMENT exception (message?, frame+)> 

<!-- A frame describes one line in a Throwable backtrace. --> 
<!ELEMENT frame (class, method, line?)> 

<!-- an integer line number within a class's source file. --> 
<!ELEMENT line (#PCDATA)> 

당신은 텍스트를 복사하고 "logger.dtd"라는 이름의 파일에 배치하고 XML 로그 파일과 같은 디렉토리에 저장해야합니다. 그러면 SAX 파서가 존재하기 때문에 파일을 찾을 수 있습니다.

logging package summary을 검색하면이 링크를 찾을 수도 있습니다.

관련 문제