Je copie du code d'une partie de notre application (une applet) à l'intérieur de l'application. J'analyse XML en tant que chaîne. Cela fait un moment que j'ai analysé XML, mais de l'erreur qui a été lancée, il semblerait que cela puisse être dû au fait de ne pas trouver le fichier .dtd. La trace de la pile rend difficile de trouver la cause exacte de l'erreur, mais voici le message:Pourquoi est-ce que je reçois "MalformedURLException: no protocol" lors de l'utilisation de SAXParser?
java.net.MalformedURLException: no protocol: <a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>
et le XML a ce que les premières lignes de couple:
<?xml version='1.0'?>
<!DOCTYPE MYTHING SYSTEM '<a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>'>
et est ici le code correspondant snippets
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);
}
}
}
Il semble que l'erreur se produit dans la méthode preparseString(), sur la ligne qui ne fait l'analyse syntaxique, la ligne m_SaxParser.parse(lSource, this);
.
FYI, le fichier 'MyComp.dtd' existe à cet emplacement et est accessible via http. Le fichier XML provient d'un service différent sur le serveur, donc je ne peux pas le changer en format file: // et mettre le fichier .dtd sur le classpath.
Merci pour la réponse rapide. Je pense que c'est la réponse la plus complète avec l'étiquette DOCTYPE corrigée complète. S'il vous plaît voir ma question ci-dessus sur la possibilité d'ignorer cette étiquette DOCTYPE depuis que je l'obtiens d'une source externe. – user26270
merci pour les réponses rapides – user26270
Vous pouvez définir le schéma sur le SAXParserFactory à un créé à partir du lien http. Je posterai un edit à la réponse ci-dessus. –