Re: utiliser Xercès pour parser un InputStream ou String?
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Message-ID | <01b301c67b29$207b39a0$0201a8c0@JARLIER> |
J'ai trouvé mon erreur: procedureCondition = element.getFirstChild().getNodeValue(); au lieu de procedureCondition = element.getNodeValue(); :) -----Message d'origine----- De : [email protected] [mailto:[email protected]] De la part de [email protected] Envoyé : vendredi 19 mai 2006 10:20 À : [email protected] Objet : [xml-tech] Re: utiliser Xercès pour parser un InputStream ou String? Merci infiniment. J'ai quelques soucis pour récupérer la valeur stockée entre tag. S'il vous plait pourriez-vous me dire ce que je fais de faux? J'ai un XML comme suit (en plus complexe): <?xml version="1.0" encoding="UTF-8"?> <alf-config> <label>label</label> <!--comment--> <procedure-condition>condition</procedure-condition> </alf-config> Ensuite j'appelle mon constructeur avec le contenu de mon XML (un String): public EthicFlow_DomXMLParser(String xmlContent) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { // ** Using factory get an instance of document builder DocumentBuilder db = dbf.newDocumentBuilder(); // ** Reader Writer creation from xmlContent this.in = new StringReader(xmlContent); this.out = new StringWriter(); // ** Parse using builder to get DOM representation of the XML //file this.dom = db.parse(new InputSource(this.in)); }catch(ParserConfigurationException pce) { pce.printStackTrace(); }catch(SAXException se) { se.printStackTrace(); }catch(IOException ioe) { ioe.printStackTrace(); } } Et ensuite je veux récupérer procedure-condition c'est-a-dire "condition" comme ceci: public String domXMLParser_getProcedureCondition() { String procedureCondition = null; try { String xpath = "/alf-config/procedure-condition"; NodeList nl = XPathAPI.selectNodeList(this.dom, xpath); Element element = (Element)nl.item(0); procedureCondition = element.getNodeValue(); } catch(TransformerException te){ Utils.addErrorMessage(MessageFormat.format(Application.getMessage(FacesConte xt.getCurrentInstance(), "TransformerException"), te .getMessage()), te); //te.printStackTrace(); } return procedureCondition; } Et ca ne plante pas mais je récupère null au lieu de "condition"... Merci d'avance Sophie -----Message d'origine----- De : [email protected] [mailto:[email protected]] De la part de Jean-Marc Desprez Envoyé : jeudi 18 mai 2006 22:41 À : [email protected] Objet : [xml-tech] Re: utiliser Xercès pour parser un InputStream ou String? Re, Quand on fait ca: > > Source s = new DOMSource(dom); > Result result = new StreamResult(out); > Transformer xformer = TransformerFactory.newInstance ().newTransformer(); > xformer.transform(s, result); > System.out.println(out.toString()); > > Comment est-ce que la liste des noeuds a-t-elle été récupérée? La liste des noeuds est dans ton objet Document (dom) Voir http://www.docjar.com/docs/api/org/w3c/dom/Document.html pour plus d'info Elle a été récupérer par la méthode parse du DocumentBuilder On modifie dom en modifiant nodes... Oui Je ne comprends pas bien comment out a été > modifié? Comment ce Transformer marche? L'objet Transformer est utilisé pour appliquer une transformation xsl à une source xml Voir http://www.docjar.com/docs/api/javax/xml/transform/Transformer.htmlpour la doc Donc on a xml + xsl = un autre xml tranformé La signature de tranform : public abstract void *transform*(Source <http://www.docjar.com/docs/api/javax/xml/transform/Source.html> xmlSource, Result <http://www.docjar.com/docs/api/javax/xml/transform/Result.html> outputTarget) Donc on à la source (le xml) et on indique un objet Result qui va contenir le résultat. Parenthèse : Et le xsl dans tout ça ? Là il faut remonter à la création de l'objet Transformer Il est obtenu à partir d'un objet TransformerFactory doc : http://www.docjar.com/docs/api/javax/xml/transform/TransformerFactory.html Dans notre cas deux méthodes nous intéresse public abstract Transformer <http://www.docjar.com/docs/api/javax/xml/transform/Transformer.html> *newTransformer*(Source <http://www.docjar.com/docs/api/javax/xml/transform/Source.html> source) throws TransformerConfigurationException <http://www.docjar.com/docs/api/javax/xml/transform/TransformerConfiguration Exception.html> Creates a new transformer using the specified stylesheet. public abstract Transformer <http://www.docjar.com/docs/api/javax/xml/transform/Transformer.html> *newTransformer*() throws TransformerConfigurationException <http://www.docjar.com/docs/api/javax/xml/transform/TransformerConfiguration Exception.html> Creates a new transformer that applies the identity transform. Si j'avais voulus tranformer le xml j'aurai utilisé le newTransformer(Source source) qui prend en paramètre le xsl. Pour l'exemple, j'ai utilisé l'autre qui n'a pas de paramètre et qui effectue une "identity tranform" (je ne suis pas sur pour la traduction je laisse en anglais !) donc le xml reste pareil. Voila fin de la parenthèse, j'espère que ça a répondu à la question "comment marche le Transformer". Pour l'objet out, il s'agit d'un StringWriter donc ça se comporte comme un objet Writer, c'est à dire qu'on peut y écrire un flux de caractères. Sauf que cet Objet n'écrit pas dans un fichier mais dans un String. "Comment à t'il été modifié" : il a été modifié par la fonction transform de l'objet Transformer. Enfin en tout cas ca marche! > Merci encore! > Sophie De rien, surtout si tu as d'autres question n'hésite pas ! Regarde bien les javadoc de chacun des objets que j'ai mis dans l'exemple car les possibilités sont grandes (tu peux utiliser des inputStream si tu veux par exemple). J'espère que tu as tout compris et que je n'ai pas dit de bêtise ! (pas de panique, si c'est le cas d'autres feront les corrections ;-) A+ -- Devenez redacteur <XML>fr et contribuez au developpement du xml francophone (http://xmlfr.org/infos/redacteurs/) ! Liste de diffusion "[email protected]" (http://xmlfr.org). Cette liste est a votre disposition pour discuter en francais de tout sujet technique lie a XML. Pour resilier votre abonnement, envoyez un message contenant la commande "unsubscribe" a [email protected] (mailto:[email protected]?Subject=unsubscribe) __________ NOD32 1.1547 (20060518) Information __________ This message was checked by NOD32 antivirus system. http://www.eset.com -- Devenez redacteur <XML>fr et contribuez au developpement du xml francophone (http://xmlfr.org/infos/redacteurs/) ! Liste de diffusion "[email protected]" (http://xmlfr.org). Cette liste est a votre disposition pour discuter en francais de tout sujet technique lie a XML. Pour resilier votre abonnement, envoyez un message contenant la commande "unsubscribe" a [email protected] (mailto:[email protected]?Subject=unsubscribe) __________ NOD32 1.1547 (20060518) Information __________ This message was checked by NOD32 antivirus system. http://www.eset.com