Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

DTD

1 réponse
Avatar
alexandre cartapanis
Bonjour,
Voila j'ai un petit probleme de parsing XML.

Mes documents xml comportent un declaration DOCTYPE comme suit:
<!DOCTYPE modulo PUBLIC "-//Modulo//DTD Modulo 2.0//EN"=20
"http://modulo.macymed.fr/DTD/2.0/module.dtd" >
Lors du parsing, il veut absolument aller me chercher sur le reseau la=20
DTD http://modulo.macymed.fr/DTD/2.0/module.dtd. Hors cette DTD est deja =

incluse dans un de mes jars. Comment expliquer au parser que la dtd pour
"-//Modulo//DTD Modulo 2.0//EN" est accessible ailleur que sur=20
http://modulo.macymed.fr/DTD/2.0/module.dtd?

Le code d'initialisationdu parser:

public synchronized ModuleDefinition parse(InputStream _stream,=20
String _fileName) throws ModuleDefinitionParseException {
if (_stream =3D=3D null) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.cannotread"));
}
DocumentBuilder docBuilder;
try {
DocumentBuilderFactory docBuilderFact;
docBuilderFact =3D DocumentBuilderFactory.newInstance();
docBuilderFact.setValidating(true);
docBuilderFact.setNamespaceAware(true);
docBuilderFact.setCoalescing(true);
docBuilderFact.setExpandEntityReferences(true);
docBuilderFact.setIgnoringComments(true);
docBuilderFact.setIgnoringElementContentWhitespace(true);
docBuilder =3D docBuilderFact.newDocumentBuilder();
} catch (FactoryConfigurationError excp) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.parserfactoryerror"),=20
excp);
} catch (ParserConfigurationException excp) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.parsererror"),=20
excp);
}
InputSource source =3D new InputSource(_stream);
try {
URL dtdURL =3D=20
this.getClass().getClassLoader().getResource(Constants.MODULE_DTD_PATH);/=
/FIXME=20
chage this eventuellay to obtain resources from others packages
if (dtdURL =3D=3D null) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.nodtd",=20
new Object[] {"module.dtd", this.getClass().getClassLoader()}));
}
System.out.println(source.getSystemId());
System.out.println(source.getPublicId());
source.setSystemId(dtdURL.toString());
source.setPublicId(null);
Document document =3D docBuilder.parse(source);
this.definition =3D new ModuleDefinition();
this.visitDocument(document);
return this.definition;
} catch (IOException excp) {
excp.printStackTrace();
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.ioerror",=20
new Object[] {_fileName}), excp);
} catch (SAXParseException excp) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.exxmlerror",=20
new Object[] {_fileName, new Integer(excp.getLineNumber()), new=20
Integer(excp.getColumnNumber())}), excp);
} catch (SAXException excp) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.xmlerror",=20
new Object[] {_fileName}), excp);
} catch (DOMException excp) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.xmlerror",=20
new Object[] {_fileName}), excp);
} catch (Exception excp) {
throw new=20
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.modul=
o.platform.loader.ModuleDefinitionParser.error",=20
new Object[] {_fileName}), excp);
}
}

--=20
Alexandre CARTAPANIS - Responsable Syst=C3=A8me et R=C3=A9seau
Email alexandre.cartapanis@macymed.fr
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kra=C3=ABmer 13014 Marseille France
T=C3=A9l. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email info@macymed.fr

1 réponse

Avatar
alexandre cartapanis
alexandre cartapanis wrote:
Bonjour,
Voila j'ai un petit probleme de parsing XML.

Mes documents xml comportent un declaration DOCTYPE comme suit:
<!DOCTYPE modulo PUBLIC "-//Modulo//DTD Modulo 2.0//EN"
"http://modulo.macymed.fr/DTD/2.0/module.dtd" >
Lors du parsing, il veut absolument aller me chercher sur le reseau la
DTD http://modulo.macymed.fr/DTD/2.0/module.dtd. Hors cette DTD est dej a
incluse dans un de mes jars. Comment expliquer au parser que la dtd pou r
"-//Modulo//DTD Modulo 2.0//EN" est accessible ailleur que sur
http://modulo.macymed.fr/DTD/2.0/module.dtd?

Le code d'initialisationdu parser:

public synchronized ModuleDefinition parse(InputStream _stream,
String _fileName) throws ModuleDefinitionParseException {
if (_stream == null) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.cannotread"));

}
DocumentBuilder docBuilder;
try {
DocumentBuilderFactory docBuilderFact;
docBuilderFact = DocumentBuilderFactory.newInstance();
docBuilderFact.setValidating(true);
docBuilderFact.setNamespaceAware(true);
docBuilderFact.setCoalescing(true);
docBuilderFact.setExpandEntityReferences(true);
docBuilderFact.setIgnoringComments(true);
docBuilderFact.setIgnoringElementContentWhitespace(true);
docBuilder = docBuilderFact.newDocumentBuilder();
} catch (FactoryConfigurationError excp) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.parserfactoryerror"),
excp);
} catch (ParserConfigurationException excp) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.parsererror"),
excp);
}
InputSource source = new InputSource(_stream);
try {
URL dtdURL =
this.getClass().getClassLoader().getResource(Constants.MODULE_DTD_PATH) ;//FIXME
chage this eventuellay to obtain resources from others packages
if (dtdURL == null) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.nodtd",
new Object[] {"module.dtd", this.getClass().getClassLoader()}));
}
System.out.println(source.getSystemId());
System.out.println(source.getPublicId());
source.setSystemId(dtdURL.toString());
source.setPublicId(null);
Document document = docBuilder.parse(source);
this.definition = new ModuleDefinition();
this.visitDocument(document);
return this.definition;
} catch (IOException excp) {
excp.printStackTrace();
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.ioerror",
new Object[] {_fileName}), excp);
} catch (SAXParseException excp) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.exxmlerror",
new Object[] {_fileName, new Integer(excp.getLineNumber()), new
Integer(excp.getColumnNumber())}), excp);
} catch (SAXException excp) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.xmlerror",
new Object[] {_fileName}), excp);
} catch (DOMException excp) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.xmlerror",
new Object[] {_fileName}), excp);
} catch (Exception excp) {
throw new
ModuleDefinitionParseException(this.messages.getMessage("fr.macymed.mod ulo.platform.loader.ModuleDefinitionParser.error",
new Object[] {_fileName}), excp);
}
}



Pour ceux que ca interresse, j'ai trouvé la (une?) solution: il faut
utiliser un EntityResolver.

docBuilder.setEntityResolver(new ModuloEntitResolver());

Si vous avez d'autre solution n'hesitez pas :)


--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email