2008-11-17 27 views
7

El archivo XML que quiero analizar comienza con:Java SAX plantea UnknownHostException

<!DOCTYPE plist PUBLIC "-//...//DTD PLIST 1.0//EN" "http://www.....dtd"> 

Así que cuando inicio el praser SAX, se trata de acceder a este DTD en línea, y me da un java.net.UnknownHostException .

  1. No puedo modificar el archivo XML antes de alimentar al analizador SAX
  2. tengo que correr, incluso sin conexión a Internet

¿Cómo puedo cambiar el comportamiento SAX para que no lo hace Intenta cargar la DTD? Gracias.

javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance(); 
factory.setValidating(false); 

javax.xml.parsers.SAXParser parser = factory.newSAXParser(); 
parser.parse(xmlFile, handler); 

Respuesta

0

Puede implementar una costumbre EntityResolver que es lo que se utiliza para buscar entidades externas durante el análisis XML.

org.xml.sax.EntityResolver customEntityResolver = new DummyEntityResolver(); 
javax.xml.parsers.SAXParser parser = factory.newSAXParser(); 
parser.getXMLReader().setEntityResolver(customEntityResolver); 
parser.parse(xmlFile, handler); 

Y en su EntityResolver personalizado, siempre devuelva nulo. Creo que debería solucionar este problema.

0

Debe proporcionar un EntityResolve para resolver el problema. Le recomendaré que escriba un resolver que sepa cómo leer los DTD localmente (siempre que los envíe junto con su aplicación). De lo contrario, devuelve nulo como sugirió Gowri.

Es posible que desee leer el the API doc.

YC

10

Ok, resulta que el método de resolución de parse() anula cualquier entidad creada previamente con el manejador aprobada en el método de análisis. El siguiente código debería funcionar:

javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance(); 
factory.setValidating(false); 
javax.xml.parsers.SAXParser parser = factory.newSAXParser(); 
parser.parse(new java.io.File("x.xml"), new org.xml.sax.helpers.DefaultHandler(){ 
     public org.xml.sax.InputSource resolveEntity(String publicId, String systemId) 
       throws org.xml.sax.SAXException, java.io.IOException { 
      System.out.println("Ignoring: " + publicId + ", " + systemId); 
      return new org.xml.sax.InputSource(new java.io.StringReader("")); 
     } 
    }); 
+0

Esta respuesta funciona como está – jkschneider

1

Utilice XMLReader en lugar de SAXParser.

XMLReader reader =XMLReaderFactory.createXMLReader(); 
reader.setEntityResolver(new DummyEntityResolver()); 
    reader.setContentHandler(handler); 
reader.parse(inputSource); 

También debería funcionar con SAXParser, pero por alguna razón no es así.

Cuestiones relacionadas