parser un fichier HTML dans une structure DOM.HTML

6 réponses
Avatar
thomas_escolan
Bonjour,

Je cherche d=E9sesp=E9remment une fa=E7on SIMPLE de parser, mais surtout
cr=E9er un fichier HTML dans une structure reprenant les interfaces
"org.w3c.dom.html". Je ne trouve m=EAme pas d'impl=E9mentations de ces
interfaces ; je ne vais quand m=EAme pas les d=E9velopper moi-m=EAme, si ?
Ou alors il y a une astuce...

J'ai pens=E9 =E0 regarder du c=F4t=E9 de JAXP, mais ne suis pas s=FBr de
comprendre comment r=E9cup=E9rer des objets impl=E9mentant sp=E9cifiquement
les interfaces en question.

Merci de vos infos, bonne continuation, Thomas.

6 réponses

Avatar
TestMan
Bjour,

En premier, pour rappel HTML n'est pas du XML, donc utiliser JAXP (un
parseur XML "classique") risque d'avoir beaucoup de difficulité ...

Va voir :
http://java-source.net/open-source/html-parsers

1er resultat sous Google avec "HTML java parser" ;-)

Ya un bail, j'avait utilisé JTidy dans un projet et j'en étais trés
satisfait, mais depuis il y a foule, à toi d'utiliser celui que tu préfère.

Dans tous les cas, si tu veux manipuler facilement le DOM (via XPATH ou
des appels simples en Java), oublie les interfaces du DOM W3C et passe
plutôt par les classiques du genre : DOM4J ou JDOM ...

A+
TM

Bonjour,

Je cherche désespéremment une façon SIMPLE de parser, mais surtout
créer un fichier HTML dans une structure reprenant les interfaces
"org.w3c.dom.html". Je ne trouve même pas d'implémentations de ces
interfaces ; je ne vais quand même pas les développer moi-même, si ?
Ou alors il y a une astuce...

J'ai pensé à regarder du côté de JAXP, mais ne suis pas sûr de
comprendre comment récupérer des objets implémentant spécifiquement
les interfaces en question.

Merci de vos infos, bonne continuation, Thomas.



Avatar
Xavier
Bonjour,

Ton besoin ressemble beaucoup au mien (voir le poste "Parser DOM avec
Xerces2"). J'ai trouvé quelques réponses.

Tu pourras trouver une implémentation des interfaces DOM HTML dans la
distribution Xerces (package org.apache.html.dom)

Il faut ensuite associer cette implémentation au parser.
C'était la question principale de mon poste précédant.

La solution que j'ai trouvé est de faire un
setParameter("http://apache.org/xml/properties/dom/document-class-name",...)
sur l'objet DOMConfiguration du parser avec en second argument le nom de
la classe d'implémentaion du Document.

Ca donne ça :

DOMImplementationRegistry registry =
DOMImplementationRegistry.newInstance();

DOMImplementation domImpl =
(DOMImplementation)registry.getDOMImplementation("Core 3.0 +LS");

DOMImplementationLS domImplLS =
(DOMImplementationLS)domImpl.getFeature("LS","3.0");

LSParser parser =
domImplLS.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);

DOMConfiguration domComfig = parser.getDomConfig();
domComfig.setParameter("http://apache.org/xml/properties/dom/document-class-name",HTMLDocumentImpl.class.getName());

HTMLDocument document = (HTMLDocument)parser.parseURI("C:test.html");
HTMLElement body = document.getBody();
...

On peut donc utiliser l'interface DOM spécifique HTML.

Par contre, je ne comprends pas pourquoi Xerces ne passe pas directement
l'instance de la DOMImplementation au parser pour qu'il puisse faire
appel à la fabrique (createDocument(), ....) plutot que de faire de la
Reflexion de classe.

Xavier
Avatar
Thomas Escolan
lut,
Merci de ta réponse, j'ai bien trouvé cette liste de parsers, mais
justrement j'aurais préféré ne pas avoir de liste... Et c'est pour ça que je
tente de me raccrocher à un standard W3C.
Merci quand même de tes conseils.

"TestMan" a écrit dans le message de news:
44118daf$0$25815$
Bjour,

En premier, pour rappel HTML n'est pas du XML, donc utiliser JAXP (un
parseur XML "classique") risque d'avoir beaucoup de difficulité ...

Va voir :
http://java-source.net/open-source/html-parsers

1er resultat sous Google avec "HTML java parser" ;-)

Ya un bail, j'avait utilisé JTidy dans un projet et j'en étais trés
satisfait, mais depuis il y a foule, à toi d'utiliser celui que tu
préfère.

Dans tous les cas, si tu veux manipuler facilement le DOM (via XPATH ou
des appels simples en Java), oublie les interfaces du DOM W3C et passe
plutôt par les classiques du genre : DOM4J ou JDOM ...

A+
TM

Bonjour,

Je cherche désespéremment une façon SIMPLE de parser, mais surtout
créer un fichier HTML dans une structure reprenant les interfaces
"org.w3c.dom.html". Je ne trouve même pas d'implémentations de ces
interfaces ; je ne vais quand même pas les développer moi-même, si ?
Ou alors il y a une astuce...

J'ai pensé à regarder du côté de JAXP, mais ne suis pas sûr de
comprendre comment récupérer des objets implémentant spécifiquement
les interfaces en question.

Merci de vos infos, bonne continuation, Thomas.





Avatar
Thomas Escolan
Merci de ta réponse (impressionnante).
Mais, du coup, quels objets récupère-t-on ? Dans un premier temps, je
voudrais plutôt créer la structure HTML (j'utilise bien JDOM) pour ça, mais
avec des objets standardisés : d'où le W3C.
En tout cas c'est intéressant, et ça me donne au moins une piste à suivre !

"Xavier" a écrit dans le message de news:
44128828$0$31117$
Bonjour,

Ton besoin ressemble beaucoup au mien (voir le poste "Parser DOM avec
Xerces2"). J'ai trouvé quelques réponses.

Tu pourras trouver une implémentation des interfaces DOM HTML dans la
distribution Xerces (package org.apache.html.dom)

Il faut ensuite associer cette implémentation au parser.
C'était la question principale de mon poste précédant.

La solution que j'ai trouvé est de faire un
setParameter("http://apache.org/xml/properties/dom/document-class-name",...)
sur l'objet DOMConfiguration du parser avec en second argument le nom de
la classe d'implémentaion du Document.

Ca donne ça :

DOMImplementationRegistry registry =
DOMImplementationRegistry.newInstance();

DOMImplementation domImpl =
(DOMImplementation)registry.getDOMImplementation("Core 3.0 +LS");

DOMImplementationLS domImplLS =
(DOMImplementationLS)domImpl.getFeature("LS","3.0");

LSParser parser =
domImplLS.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);

DOMConfiguration domComfig = parser.getDomConfig();
domComfig.setParameter("http://apache.org/xml/properties/dom/document-class-name",HTMLDocumentImpl.class.getName());

HTMLDocument document = (HTMLDocument)parser.parseURI("C:test.html");
HTMLElement body = document.getBody();
...

On peut donc utiliser l'interface DOM spécifique HTML.

Par contre, je ne comprends pas pourquoi Xerces ne passe pas directement
l'instance de la DOMImplementation au parser pour qu'il puisse faire appel
à la fabrique (createDocument(), ....) plutot que de faire de la Reflexion
de classe.

Xavier


Avatar
Xavier
Mais, du coup, quels objets récupère-t-on ?
Le parser renvoie (par le parseURI dans l'exemple) un objet conforme à

l'interface 'Document' du W3C. Donc on peut naviger dans l'arbre DOM
avec les méthodes standards.
Mais comme on a précisé la classe d'implémentation par le parametre
document-class-name, l'instance de notre Document est de type
'HTMLDocumentImpl'. C'est pour cela que le Document peut être casté en
HTMLDocument.
Par la suite, on pourra naviguer dans l'arbre DOM avec, en plus, des
méthodes spécifiques HTML (comme getBody()).

Dans un premier temps, je
voudrais plutôt créer la structure HTML (j'utilise bien JDOM) pour ça, mais
avec des objets standardisés : d'où le W3C.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Tout à fait d'accord, voir PS.

Je ne suis pas sûr d'avoir bien compris ce que tu entends par "créer la
structure HTML", mais si c'est "écrire" un document HTML avec les
méthodes DOM, ça donne ça :

DOMImplementation impl = DOMImplementationImpl.getDOMImplementation();
Document doc = impl.createDocument(null,null,null);

Element html = doc.createElement("html");
doc.appendChild(html);

Element body = doc.createElement("body");
html.appendChild(body);

body.setAttribute("bgcolor","Red");

Là, on est 100% DOM. Mais c'est un peu lourd !!!
Autant utiliser les interfaces DOM spécialisées :

HTMLDOMImplementation impl HTMLDOMImplementationImpl.getHTMLDOMImplementation();
HTMLDocument doc = impl.createHTMLDocument("Titre");
HTMLBodyElement body = (HTMLBodyElement)doc.createElement("body");
doc.setBody(body);
body.setBgColor("Red");
body.setTextContent("Test");

C'est mieux !!!

Il ne reste plus qu'à sérialiser le document créé :

DOMImplementationLS domImplLS (DOMImplementationLS)impl.getFeature("LS","3.0");
LSSerializer serializer = domImplLS.createLSSerializer();
LSOutput output = domImplLS.createLSOutput();
output.setByteStream(System.out);
serializer.write(doc,output);


<?xml version="1.0" encoding="UTF-8"?>
<HTML><HEAD><TITLE>Titre</TITLE></HEAD><BODY
bgcolor="Red">Test</BODY></HTML>


Voilà.

P.S:
Beaucoup de personnes diront que le DOM est un peu lourd.
C'est vrai qu'on peut faire plus consis avec des outils propriétaires.
Mais bon, le W3C spécifie des technologies indépendantes de la
plateforme et du langage. Ca a ses inconvegnants.
Mais ce sera tout de même formidable lorsqu'on pourra modéliser un
système sans se soucier du langage, de la plateforme, et des
frameworks... (voir travaux de l'OMG).

Bon courage !!!

Avatar
Thomas Escolan
OK, j'ai tout compris ; merci beaucoup, c'est EXCELLENT !

"Xavier" a écrit dans le message de news:
441a759c$0$30099$
Mais, du coup, quels objets récupère-t-on ?
Le parser renvoie (par le parseURI dans l'exemple) un objet conforme à

l'interface 'Document' du W3C. Donc on peut naviger dans l'arbre DOM avec
les méthodes standards.
Mais comme on a précisé la classe d'implémentation par le parametre
document-class-name, l'instance de notre Document est de type
'HTMLDocumentImpl'. C'est pour cela que le Document peut être casté en
HTMLDocument.
Par la suite, on pourra naviguer dans l'arbre DOM avec, en plus, des
méthodes spécifiques HTML (comme getBody()).

Dans un premier temps, je voudrais plutôt créer la structure HTML
(j'utilise bien JDOM) pour ça, mais avec des objets standardisés : d'où
le W3C.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Tout à fait d'accord, voir PS.

Je ne suis pas sûr d'avoir bien compris ce que tu entends par "créer la
structure HTML", mais si c'est "écrire" un document HTML avec les méthodes
DOM, ça donne ça :

DOMImplementation impl = DOMImplementationImpl.getDOMImplementation();
Document doc = impl.createDocument(null,null,null);

Element html = doc.createElement("html");
doc.appendChild(html);

Element body = doc.createElement("body");
html.appendChild(body);

body.setAttribute("bgcolor","Red");

Là, on est 100% DOM. Mais c'est un peu lourd !!!
Autant utiliser les interfaces DOM spécialisées :

HTMLDOMImplementation impl > HTMLDOMImplementationImpl.getHTMLDOMImplementation();
HTMLDocument doc = impl.createHTMLDocument("Titre");
HTMLBodyElement body = (HTMLBodyElement)doc.createElement("body");
doc.setBody(body);
body.setBgColor("Red");
body.setTextContent("Test");

C'est mieux !!!

Il ne reste plus qu'à sérialiser le document créé :

DOMImplementationLS domImplLS > (DOMImplementationLS)impl.getFeature("LS","3.0");
LSSerializer serializer = domImplLS.createLSSerializer();
LSOutput output = domImplLS.createLSOutput();
output.setByteStream(System.out);
serializer.write(doc,output);


<?xml version="1.0" encoding="UTF-8"?>
<HTML><HEAD><TITLE>Titre</TITLE></HEAD><BODY
bgcolor="Red">Test</BODY></HTML>


Voilà.

P.S:
Beaucoup de personnes diront que le DOM est un peu lourd.
C'est vrai qu'on peut faire plus consis avec des outils propriétaires.
Mais bon, le W3C spécifie des technologies indépendantes de la plateforme
et du langage. Ca a ses inconvegnants.
Mais ce sera tout de même formidable lorsqu'on pourra modéliser un système
sans se soucier du langage, de la plateforme, et des frameworks... (voir
travaux de l'OMG).

Bon courage !!!