2008-10-28 12 views

답변

18

고유 한 EntityResolver를 지정하거나 파서의 특정 기능을 사용할 수 있어야합니까? 일부 접근법에 대해서는 here을 참조하십시오.

더 완벽한 예 :

<?xml version="1.0"?> 
<!DOCTYPE foo PUBLIC "//FOO//" "foo.dtd"> 
<foo> 
    <bar>Value</bar> 
</foo> 

그리고 XPath를 사용 :이 도움이

import java.io.File; 
import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.xml.sax.EntityResolver; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 

     builder.setEntityResolver(new EntityResolver() { 

      @Override 
      public InputSource resolveEntity(String publicId, String systemId) 
        throws SAXException, IOException { 
       System.out.println("Ignoring " + publicId + ", " + systemId); 
       return new InputSource(new StringReader("")); 
      } 
     }); 
     Document document = builder.parse(new File("src/foo.xml")); 
     XPathFactory xpathFactory = XPathFactory.newInstance(); 
     XPath xpath = xpathFactory.newXPath(); 
     String content = xpath.evaluate("/foo/bar/text()", document 
       .getDocumentElement()); 
     System.out.println(content); 
    } 
} 

희망 ... 내가 전에이 문제를 가지고

+0

덕분에,이 내가 7 –

2

. DTD의 로컬 복사본을 다운로드하여 저장 한 다음 로컬 복사본에 대해 유효성을 검사하여 해결했습니다. 로컬 복사본을 가리 키도록 XML 파일을 편집해야합니다. 여기

<!DOCTYPE root-element SYSTEM "filename"> 

조금 더 많은 정보를 원하시면 : http://www.w3schools.com/dtd/dtd_intro.asp

난 당신이 수동으로 파서에서 "false"로 validateOnParse 속성의 어떤 종류를 설정할 수 있다고 생각합니다. XML을 파싱하는 데 사용하는 라이브러리에 따라 다릅니다. 여기

상세 정보 : http://www.w3schools.com/dtd/dtd_validation.asp

13

이 나를 위해 일한 :

SAXParserFactory saxfac = SAXParserFactory.newInstance(); 
    saxfac.setValidating(false); 
    try { 
    saxfac.setFeature("http://xml.org/sax/features/validation", false); 
    saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
    saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    saxfac.setFeature("http://xml.org/sax/features/external-general-entities", false); 
    saxfac.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 
    } 
    catch (Exception e1) { 
    e1.printStackTrace(); 
    } 
+3

하나의 요인에 의해 수행 된 일부 단위 테스트를 감소 -이 여기에 가장 좋은 대답은 - 그러나이 줄만을 사용하면 충분합니다 :''saxfac.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);'' –

관련 문제