IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Parser XHTML en Java ? possible ?


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Par défaut Parser XHTML en Java ? possible ?
    Bonjour,

    Pour me faciliter la vie, j'ai besoin de génerer un PDF en Java. Je voudrais le faire (avec la librairie iText, à partir d'un document XHTML). Je me suis dit que comme le XHTML n'est qu'une sorte de XML je pourrais parser mon XML et donc génerer le PDF. Mais non le XHTML comprend un doctype. Et donc si je fais un getRootElement() du Document JDOM correspondant à mon fichier HTML, j'ai une erreur (java.net.UnknownHostException), j'avoue humblemnt que je comprend qu'il y ai une exception mais que je ne comprend pas pourquoi cette exception. Je voudrais si possible savoir comment mettre le pointeur à partir du body, parce que les balises meta et tout le reste ne m'interesse pas. Voici ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    package com.datalion.website.parser;
     
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.List;
     
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
     
     
    public class XHTMLParser
    {
        private SAXBuilder sxb;
        private String path;
        private Document doc;
        private Element root;
        public XHTMLParser()
        {
            this.sxb = new SAXBuilder();
        }
        public void parse(String URL)
        {
     
            this.path=URL;
            try
            {
                this.doc = sxb.build(new FileInputStream(this.path)); // <- java.net.UnknownHostException:
                this.root = doc.getRootElement();
            }
            catch(JDOMException e1)
            {
                e1.printStackTrace();
            }
            catch(IOException e2)
            {
                e2.printStackTrace();
            }
        }
        public Object getElementById(String id)
        {
            return searchObject(id);
        }
        private Object searchObject(String uniqueIdentifier)
        {
            List level = this.root.getChildren();
            for(int i = level.size() ; i > 0 ; i --)
            {
                Element current = (Element) level.get(i);
                if(current.getAttributeValue("id").equals(uniqueIdentifier))
                {
                    return current.getAttributeValue("id").equals(uniqueIdentifier);
                }
            }
            return searchObject(uniqueIdentifier);
        }
        public Object root()
        {
            return this.root;
        }
    }
    Pourriez vous m'aidez ?

  2. #2
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    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) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre éprouvé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Par défaut
    Citation Envoyé par azerr Voir le message
    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) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    merci mais ce que je veut c'est pas parser le flux de la dtd (XHTML)


    mais bien mon flux

    enfait c'est un flux génerer par un servlet

    merci pour le plugin

    [mode raleur]il n'y a m^me pas d'update site[/mode raleur]

  4. #4
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    merci mais ce que je veut c'est pas parser le flux de la dtd (XHTML)
    Mais justement ca permet de parser le flux XHTML et pas celui de la DTD.
    En fait la classe EmptyEntityResolver simule que tu as la DTD et comme ca SAX ne renvoie pas d'erreur. Apres ton DOM est alimente avec le contenu de ton XHTML.

    Angelo

  5. #5
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [mode raleur]il n'y a m^me pas d'update site[/mode raleur]
    Oui je sais, mais c'est super complique a faire un update site sur sf.
    Je n'ai pas eu le temps de m'en occuper, je suis a fond dans mon autre projet Tk-UI qui permet de decrire des UI (Swing, SWT...) en XML (XUL, XHTML...), CSS et Javascript et qui sera ensuite integrer a Akrogen .

    Angelo

  6. #6
    Membre éprouvé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Par défaut
    PS : un update site te permettrais de rendre possible l'installation de ton plugin eclipse par mon appli (un installateur de parc informatique, que j'ai pas encore finis)

    et c'est quelle classe que je dois prendre ?

Discussions similaires

  1. Plesk, CPanel & co pour des applications java: possible?
    Par Tourix dans le forum Serveurs (Apache, IIS,...)
    Réponses: 3
    Dernier message: 12/01/2007, 11h46
  2. [JAVA] Appels Java possibles en C ???
    Par Gaaaga dans le forum C
    Réponses: 4
    Dernier message: 23/02/2006, 11h29
  3. Accéder à Microsoft Excel, Word via Java ? Possible?
    Par ADONET dans le forum Documents
    Réponses: 8
    Dernier message: 27/01/2006, 20h16
  4. [Executable]Faire un CD Multimédia en Java : possible ?
    Par calogerogigante dans le forum Général Java
    Réponses: 17
    Dernier message: 03/11/2005, 12h12
  5. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo