Bonjour,
J'en ai passe des heures et des heures sur ce probleme.
En fait lorsque tu met un DOCTYPE en entete, cela signifie que le XML doit etre valide par une DTD.
Dans le cas de XHTML, le doctype pointe sur la DTD
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd. Donc il faut par exemple indiquer au parser SAX a l'aide de setEntityResolver comment recuperer le flux de cetet DTD. Le probleme c'est qu cette DTD peut faire reference a une autre DTD. Cela peut vite devenir horrible.
Dans ton cas, si tu n'as pas besoin de valider ton document, tu peut utiliser la classe que j'ai faite dans
Akrogen
qui permet de charger un XML avec un doctype ou un schema XML sans etre oblige de le valider par la DTD pou le schema.
Voici la classe (epure) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* EntityResolver used to load XML file which include DTD/Schema without having
* this DTD/Schema.
*
* @version 1.0.0
* @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a>
* @see methode getDocumentBuilderEmptyEntityResolver of XMLUtils class.
*/
public class EmptyEntityResolver implements EntityResolver {
private String xml;
public EmptyEntityResolver() {
this("1.0", "UTF-8");
}
public EmptyEntityResolver(String version, String encoding) {
// Compute XML content
this.xml = getXMLContent(version, encoding);
}
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
return new InputSource(new ByteArrayInputStream(this.xml.getBytes()));
}
private String getXMLContent(String version, String encoding) {
StringBuffer content = new StringBuffer("<?xml ");
if (version != null && version.length() > 0) {
content.append("version=\"");
content.append(version);
content.append("\" ");
}
if (encoding != null && encoding.length() > 0) {
content.append("encoding=\"");
content.append(encoding);
content.append("\" ");
}
content.append(" ?>");
return content.toString();
}
} |
Ensuite pour l'utiliser dans ton code, tu fais comme ceci :
1 2 3 4 5
| public void parse(InputStream URL) {
try {
sxb.setEntityResolver(new EmptyEntityResolver());
this.doc = sxb.build(URL); // <-
... |
J'espere que ca pourra t'aider.
Angelo
Partager