Estoy copiando el código de una parte de nuestra aplicación (un applet) dentro de la aplicación. Estoy analizando XML como una cadena. Ha pasado un tiempo desde que analicé XML, pero a partir del error que se arroja, parece que podría tener que ver con no encontrar el .dtd. El seguimiento de la pila hace que sea difícil encontrar la causa exacta del error, pero aquí está el mensaje:¿Por qué recibo "MalformedURLException: no protocol" cuando uso SAXParser?
java.net.MalformedURLException: no protocol: <a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>
y el XML tiene esto como el primer par de líneas:
<?xml version='1.0'?>
<!DOCTYPE MYTHING SYSTEM '<a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>'>
y está el código relevante aquí fragmentos
class XMLImportParser extends DefaultHandler {
private SAXParser m_SaxParser = null;
private String is_InputString = "";
XMLImportParser(String xmlStr) throws SAXException, IOException {
super();
is_InputString = xmlStr;
createParser();
try {
preparseString();
parseString(is_InputString);
} catch (Exception e) {
throw new SAXException(e); //"Import Error : "+e.getMessage());
}
}
void createParser() throws SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
factory.setFeature("http://xml.org/sax/features/namespaces", true);
factory.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
m_SaxParser = factory.newSAXParser();
m_SaxParser.getXMLReader().setFeature("http://xml.org/sax/features/namespaces", true);
m_SaxParser.getXMLReader().setFeature("http://xml.org/sax/features/namespace-prefixes", true);
} catch (SAXNotRecognizedException snre){
throw new SAXException("Failed to create XML parser");
} catch (SAXNotSupportedException snse) {
throw new SAXException("Failed to create XML parser");
} catch (Exception ex) {
throw new SAXException(ex);
}
}
void preparseString() throws SAXException {
try {
InputSource lSource = new InputSource(new StringReader(is_InputString));
lSource.setEncoding("UTF-8");
m_SaxParser.parse(lSource, this);
} catch (Exception ex) {
throw new SAXException(ex);
}
}
}
parece que el error está ocurriendo en el método preparseString(), en la línea que realmente hace el análisis, la línea m_SaxParser.parse(lSource, this);
.
Para su información, el archivo 'MyComp.dtd' existe en esa ubicación y se puede acceder a través de http. El archivo XML proviene de un servicio diferente en el servidor, por lo que no puedo cambiarlo a formato file: // y poner el archivo .dtd en classpath.
Gracias por la rápida respuesta. Creo que esta es la respuesta más completa con la etiqueta DOCTYPE corregida completa. Consulte mi pregunta anterior sobre la posibilidad de ignorar esta etiqueta DOCTYPE ya que la obtengo de una fuente externa. – user26270
gracias por las respuestas rápidas – user26270
Puede establecer el esquema en SAXParserFactory en uno creado a partir del enlace http. Publicaré una edición a la respuesta anterior. –