2008-10-28 11 views

cevap

18

Kendi EntityResolver belirtmek veya ayrıştırıcı belirli özelliklerini kullanmak gerekir? Bazı yaklaşımlar için bkz. here.

daha tam bir örnek:

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

Ve xpath kullanımı: Bu yardımcı olur

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); 
    } 
} 

Umut ... Daha önce bu sorun vardı

+0

sayesinde bu ben 7. –

2

. DTD'nin yerel bir kopyasını indirip saklayarak ve ardından yerel kopyaya göre doğrulayarak çözdüm. Yerel dosyayı işaret edecek şekilde XML dosyasını düzenlemeniz gerekir. Burada

<!DOCTYPE root-element SYSTEM "filename"> 

Biraz daha bilgi: http://www.w3schools.com/dtd/dtd_intro.asp

sana el ile de ayrıştırıcı "false" validateOnParse özelliğinin çeşit ayarlayabilirsiniz düşünüyorum. XML'yi ayrıştırmak için kullandığınız kitaplığa bağlıdır. Burada

diğer bilgiler: http://www.w3schools.com/dtd/dtd_validation.asp

13

Bu benim için çalıştı:

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

+1 kat yapıyordu bazı birim testi azaltılmış - Bu burada en iyi cevaptır - ancak yalnızca hat kullanmak yeterlidir: ("http://apache.org/xml/features/nonvalidating/load-external-dtd" yanlış) '' saxfac.setFeature; ' –

İlgili konular