OVH Cloud OVH Cloud

[DOM XPATH] comment effectuer une requete xpath avec DOM

2 réponses
Avatar
y.a.n
Bonjour
est il possible d effectuer dans dom des selection de Node avec des
expression xpath
comme avec xsl
ex :
match="//mon_noeud[@id='12']"
y aurait it un truc genre
Element e = document.getElement("//mon_noeud[@id='12']");

merci.

2 réponses

Avatar
sebvillalon
"y.a.n" wrote in message news:<3f5ef60b$0$13293$...
Bonjour
est il possible d effectuer dans dom des selection de Node avec des
expression xpath
comme avec xsl
ex :
match="//mon_noeud[@id='12']"
y aurait it un truc genre
Element e = document.getElement("//mon_noeud[@id='12']");

merci.


A ma conanissance, ce n'est pas possible, pour la bonnne et simple
raison qu'XPath ne fait pas partie de la norme DOM.
Par contre, des API l'implémente, comme Xalan (puisqu'XPath est
utilisé dans XSL). regarde un peu chez Apache. C'est peut-être pas
aussi simple que tu l'espères, mais j'ai déjà utilisé la classe XPath.

Avatar
LOSINGER Olivier
En utilisant XPathAPI.selectNodeIterator(document, xPath); et en parcourant
le NodeIterator, tu dois pouvoir faire cela .

Ci joint une copie de code implementant cette fonction:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;


import org.w3c.dom.*;
import org.w3c.dom.Node;
import java.io.FileOutputStream;
import org.apache.xml.serialize.XMLSerializer;
import org.apache.xml.serialize.OutputFormat;


/** util pour xpath **/
import org.w3c.dom.traversal.NodeIterator;
import org.apache.xpath.XPathAPI;
/** E/S */
import java.io.*;


import java.util.Hashtable;
import java.util.Enumeration ;
import java.util.Vector ;



public class Base {

private String requete;
private Hashtable table=new Hashtable();
private Document document;
private Element root;
private NodeIterator nl;




/**
*Constructeur
**/
public Base() {

DocumentBuilderFactory fabrique = null;

try {
fabrique = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fabrique.newDocumentBuilder
();
document = builder.newDocument();
Element root = (Element) document.createElement
("BASE");
document.appendChild(root);
}

catch (Exception e)
{
e.printStackTrace();
}

}
/**
*Methode read:Lecture de la base
*@param file Fichier à lire
**/
public void read(String file)
{
try
{
//creation du factory
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
//creation du builder */
DocumentBuilder builder = factory.newDocumentBuilder();
//on parse le fichier
document = builder.parse( new File(file) );
//on obtient la liste des noeuds
NodeList listdoc=document.getChildNodes();
//on recupere le fils cad le root
//root=(Element)listdoc.item(0);
}
catch (Exception e)
{
e.printStackTrace();
}


}


/**
*Ecriture dans le fichier
*@param file nom du fichier
*@return aucun
**/
public void write(String file)
{

OutputFormat outf = new OutputFormat();
outf.setIndent(0);
outf.setIndenting(true);
outf.setEncoding("ISO-8859-1");

try
{
XMLSerializer xmls = new XMLSerializer(new
FileOutputStream(file),outf);
xmls.serialize(document);
}
catch ( Exception e )
{
System.out.println("XMLGenerator : error "+e);
}
}

public void query(String xPath)throws Exception
{
nl = XPathAPI.selectNodeIterator(document, xPath);
}


public Vector getResult()
{
Vector result=new Vector();
Node n=null;
while((n= nl.nextNode())!=null)
{
result.addElement(n);
}
// System.out.println(result.size());
return result;
}






}





news::

"y.a.n" wrote in message
news:<3f5ef60b$0$13293$...
Bonjour
est il possible d effectuer dans dom des selection de Node avec des
expression xpath
comme avec xsl
ex :
match="//mon_noeud[@id='12']"
y aurait it un truc genre
Element e = document.getElement("//mon_noeud[@id='12']");

merci.


A ma conanissance, ce n'est pas possible, pour la bonnne et simple
raison qu'XPath ne fait pas partie de la norme DOM.
Par contre, des API l'implémente, comme Xalan (puisqu'XPath est
utilisé dans XSL). regarde un peu chez Apache. C'est peut-être pas
aussi simple que tu l'espères, mais j'ai déjà utilisé la classe XPath.