2011-11-10 4 views
10

XOM XML 라이브러리로 파일을 구문 분석 할 때 DTD 선언을 무시할 수 있습니까? 내 파일은 다음 줄이 있습니다XML 구문 분석시 DTD 무시

<?xml version="1.0"?> 
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd"> 
//rest of stuff here 

을 내가) (내 문서를 빌드 할 때 나는 DTD 파일에 대한 filenotfound 예외를 얻을. 이 파일이 없으므로 걱정하지 않으므로 XOM을 사용할 때 어떻게 제거 할 수 있습니까? 나는이 라인에서 NullPointerException이 얻을

public BlastXMLParser(String filePath) { 
    Builder b = new Builder(false); 
    //not a good idea to have exception-throwing code in constructor 
    try { 

     _document = b.build(filePath); 
    } catch (ParsingException ex) { 
     Logger.getLogger(BlastXMLParser.class.getName()).log(Level.SEVERE,"err", ex); 
    } catch (IOException ex) { 
     // 
    } 

private Elements getBlastReads() { 
    Element root = _document.getRootElement(); 
    Elements rootChildren = root.getChildElements(); 

    for (int i = 0; i < rootChildren.size(); i++) { 
     Element child = rootChildren.get(i); 
     if (child.getLocalName().equals("BlastOutput_iterations")) { 

      return child.getChildElements(); 
     } 
    } 

    return null; 
} 
} 

: 여기

는 코드입니다 제가 성공적으로 분석 할 수있는 소스 XML 파일에서 제거 된 DTD 라인

Element root = _document.getRootElement(); 

하지만,이 최종 생산 시스템에서는 옵션이 아닙니다.

+0

당신이 구문 분석하는 데 사용되는'code'을 보여줄 수 : XOM에서이 같은 빌더 생성자에 XMLReader를 전달하여 가능해야한다? – bbaja42

답변

-4

문서에 따르면 이는 유효성 검사없이 문서를 구문 분석하는 방법입니다. 당신이 XML 스키마 유효성을 검사 할 경우

try { 
    Builder parser = new Builder(); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. How embarrassing!"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

당신은 new Builder(true) 전화를해야 : 지금 또 다른 예외가 발생 할 수 있습니다

try { 
    Builder parser = new Builder(true); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ValidityException ex) { 
    System.err.println("Cafe con Leche is invalid today. (Somewhat embarrassing.)"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. (How embarrassing!)"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

에주의 : ValidityException

+1

내 코드 스 니펫을 살펴보십시오. 문서에 쓰여진 내용을 따라 가면 작동하지 않습니다. – LordDoskias

13

선호되는 솔루션을하는 것을 EntityResolver을 구현하여 DTD에 대한 요청을 가로 채고 이것을 임베디드 사본으로 재 지정하십시오. 만약 당신

  1. 는 DTD에 대한 액세스 및
  2. 이없는 당신과
  3. (떨어져 검증에서 그것은 또한 문자 문서에 사용되는 엔티티를 선언 할 수 있음)이 필요하지 않습니다 절대적으로 확신 Xerces XML Parser 구현을 사용 중입니다.

해당 SAX 기능을 설정하여 DTD를 가져올 수 없도록 설정할 수 있습니다.

import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.XMLReaderFactory; 

... 

XMLReader xmlreader = XMLReaderFactory.createXMLReader(); 
xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
Builder builder = new Builder(xmlreader); 
+0

그렇지 않으면 내 xmlreader가 DOCTYPE 선언을보고 난 후 영원히 교수형을 당합니다. –