siropipo
Messages postés26Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention21 juin 2005
-
2 juin 2005 à 23:08
Akbarr
Messages postés15Date d'inscriptionmercredi 15 juin 2005StatutMembreDernière intervention23 juin 2005
-
20 juin 2005 à 10:16
public static void main(String args[]) throws Exception {
XML m = new XML();
}
public XML() {
RechercheXml();
}
public static Element findFirstElement( Element element, String name )
{
NodeList nl = element.getElementsByTagName( name );
if ( nl.getLength() < 1 )
throw new NullPointerException(
"Element: "+element+" ne contient pas: "+name);
return (Element)nl.item(0);
}
public static Vector trouveAttribut( Element element, String nom )
{
Vector attr = new Vector(1);
HashMap map = new HashMap();
Element elementNom = element;
if (nom != null)
elementNom = findFirstElement( element, nom );
NamedNodeMap attributs = elementNom.getAttributes();
public Element getChildElement(Element parent, String name)
{
NodeList children = parent.getChildNodes();
for (int i 0, totElem children.getLength(); i < totElem; i++) {
Node candidateNode = children.item(i);
if ((candidateNode.getNodeType() == Node.ELEMENT_NODE) &&
name.equals(candidateNode.getNodeName())) {
return (Element) candidateNode;
}
}
return null;
}
public String getContentAsString(Element elem)
{
// Simple implementation, assume no comments, nor proc instruction, ...
elem.normalize(); // just in case multi-text block
public Element findElementbyAttrib(NodeList elemList,
String attribName, String attribValue)
{
for (int i=0; i<elemList.getLength(); i++)
{
Element elem = (Element) elemList.item(i);
if (attribValue.equals(elem.getAttribute(attribName))) return elem;
}
return null;
}
public static void main(String args[])
{
Test helper = new Test();
// locate all 'tag' elements within the tags list,
// assume simple structure -> getElementsByTagName directly on root
NodeList tagList = root.getElementsByTagName("tag");
String keyToFind = "aValue"; // The value to find (i.e. 01, ...)
Element elem = helper.findElementbyAttrib(tagList, "id", keyToFind);
// Do something with the element
if (null != elem)
{
System.out.println("Element Name: " + elem.getAttribute("name"));
JeanPoldeux
Messages postés64Date d'inscriptionmardi 14 janvier 2003StatutMembreDernière intervention 5 août 2005 6 juin 2005 à 01:04
//Ouvrir un nouveau Parser
DOMParser parser = new DOMParser();
//Parser le fichier XML
parser.parse(filename);
//Atteindre l'élément racine de l'arborescence XML
Document doc = parser.getDocument();
//Obtenir une liste du premier niveau de noeuds du document
org.w3c.dom.NodeList nlObj = reader.getDocumentElement().getChildNodes();
//Traiter le noeuds
for(int i = 0; i < nlObj.getLength(); i++)
{
//Traiter le premier niveau
org.w3c.dom.Node node = nlObj.item(i);
String nodeName = node.getNodeName();
String idValue = node.getAttributes().getNamedItem("ID").getNodeValue();
//Obtenir le second niveau
Si tu veux descendre plus loin dans l'arbre
, tu utilises la méthode getChildNodes() sur un élément node.
Attention en enchaînant les méthodes ( node.getAttributes().getNamedItem("ID").getNodeValue() ), si tu as un des éléments qui renvoit "null",
ca va planter en exécution et c'est parfois difficile de trouver où.
En espérant avoir ouvert la voie
@++
<hr>
Every problem has a solution. The difficulty is to find it out.
Vous n’avez pas trouvé la réponse que vous recherchez ?
JeanPoldeux
Messages postés64Date d'inscriptionmardi 14 janvier 2003StatutMembreDernière intervention 5 août 2005 6 juin 2005 à 19:44
Element elemId = doc.getElementById(ID);
elemId est null car doc est null. Il doit déjà y avoir nullPointerException ici.
Le problème est dans ta fonction lectureFichier
// recuperer une fabrique de constructeur de Dom
javax.xml.parsers. DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); try
{
// recuperer un constructeur de Dom
javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder(); // parser pour construire le Dom
org.w3c.dom.Document document = builder.parse( fileName );
//Renvoi de la racine
return document.getDocumentElement() ;
}
catch (Exception e)
{
e.printStackTrace ();
}
Cette procédure renvoi un objet Node que tu peux traiter
@++
<hr>
Every problem has a solution. The difficulty is to find it out.
siropipo
Messages postés26Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention21 juin 2005 6 juin 2005 à 21:22
Oki dok !
la facon dont je faisait mon constructeur n'allait pas ?
sinon jai encore une erreur ici :
protected Document lectureFichier( String fileName )
{
//recuperer une fabrique de constructeur de Dom
javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
try {
// recuperer un constructeur de Dom
javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
// parser pour construire le Dom
org.w3c.dom.Document document = builder.parse( fileName );
//Renvoi de la racine
return document.getDocumentElement(); <<=== Type mismatch: cannot convert from Element to Document
siropipo
Messages postés26Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention21 juin 2005 10 juin 2005 à 14:17
salut !
oki pour ca.
mais apres a chaque fois que je vais chercher un element, les fonctions suivantes ne sont plus bonne :
Element doc = lectureFichier(fich);
System.out.println(doc);
for (; pos < res;)
{
//On recupere l'id du Tag
byte[] id = new byte[2];
ficIn.read(id,0,2);
String ID = new String(id);
System.out.println(ID);
pos += 2;
//lecture fichier xml afin de recuperer le name
Element elemId = doc.getElementById(ID); <<==
System.out.println(elemId);
String idName = elemId.getNodeName();
System.out.println(idName);
//ecriture Xml
//On recupere la longueur du Tag
byte[] len = new byte[2];
ficIn.read(len,0,2);
str = new String(len);
int longueur = Integer.parseInt(str,16);
longueur *= 2;
System.out.println(longueur);
pos += 2;
//On recupere les données correspondant au Tag
byte[] donnee = new byte[longueur];
ficIn.read(donnee,0,longueur);
String data = new String(donnee);
System.out.println(data);
pos += longueur;
protected Element lectureFichier( String fileName )
{
//recuperer une fabrique de constructeur de Dom
javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
try {
// recuperer un constructeur de Dom
javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
// parser pour construire le Dom
org.w3c.dom.Document document = builder.parse( fileName );
//Renvoi de la racine
return document.getDocumentElement();
}
catch (Exception e)
{
e.printStackTrace ();
}
}
nan ? faut ke je fasse des getnode childs a chaque fois ? un peu daide sivouplait suis perdu la
public Element getChildElement(Element parent, String name)
{
NodeList children = parent.getChildNodes();
for (int i 0, totElem children.getLength(); i < totElem; i++) {
Node candidateNode = children.item(i);
if ((candidateNode.getNodeType() == Node.ELEMENT_NODE) &&
name.equals(candidateNode.getNodeName())) {
return (Element) candidateNode;
}
}
return null;
}
public String getContentAsString(Element elem)
{
// Simple implementation, assume no comments, nor proc instruction, ...
elem.normalize(); // just in case multi-text block
public Element findElementbyAttrib(NodeList elemList,
String attribName, String attribValue)
{
for (int i=0; i<elemList.getLength(); i++)
{
Element elem = (Element) elemList.item(i);
if (attribValue.equals(elem.getAttribute(attribName))) return elem;
}
return null;
}
public static void main(String args[])
{
Test helper = new Test();
// locate all 'tag' elements within the tags list,
// assume simple structure -> getElementsByTagName directly on root
NodeList tagList = root.getElementsByTagName("tag");
String keyToFind = "aValue"; // The value to find (i.e. 01, ...)
Element elem = helper.findElementbyAttrib(tagList, "id", keyToFind);
// Do something with the element
if (null != elem)
{
System.out.println("Element Name: " + elem.getAttribute("name"));
siropipo
Messages postés26Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention21 juin 2005 16 juin 2005 à 20:43
Nikel !!!
merci beaucoup a toi,
par contre est ce que tu pourrais me commenter un peu ce kil se passe dans ces fonctions (ou au moins corrigé ce ke jai compris) :
public Element getChildElement(Element parent, String name)
{
NodeList children = parent.getChildNodes();
for (int i 0, totElem children.getLength(); i < totElem; i++) {
Node candidateNode = children.item(i);
if ((candidateNode.getNodeType() == Node.ELEMENT_NODE) &&
name.equals(candidateNode.getNodeName())) {
return (Element) candidateNode;
}
}
return null;
}
public String getContentAsString(Element elem)
{
// Simple implementation, assume no comments, nor proc instruction, ...
elem.normalize(); // just in case multi-text block
public Element findElementbyAttrib(NodeList elemList,
String attribName, String attribValue)
{
for (int i=0; i<elemList.getLength(); i++)
{
// on crée une liste d'element
Element elem = (Element) elemList.item(i);
//on retourne l'element qui contient la valeur l'attribut recherché
if (attribValue.equals(elem.getAttribute(attribName))) return elem;
}
return null;
}
je te pose la question mais apparament elle servent pas ces fonctions dans mon programme
Akbarr
Messages postés15Date d'inscriptionmercredi 15 juin 2005StatutMembreDernière intervention23 juin 20051 20 juin 2005 à 10:16
En fait, le sample que je t'ai donné permet de rechercher un element en utilisant la valeur d'un de ses attributs (findElementbyAttrib). Ce qui correspond à ton problème initial :)
Ce que font les fonctions est assez simple:
getChildElement: Retourne le premier élément fils d'un élément qui à un nom spécifique. Pour celà, il récupére les noeuds directement (1 seul niveau) sous un élément ( parent.getChildNodes();), il itère ces noeuds et si un noeud est de type élément et à comme nom le paramètre passé (name), il retourne l'élément. Un getElementsByTagName est tout aussi valable. Mais cette méthode est bcp + performante lorsque tu manipules de gros document DOM ayant une profondeur d'élément importante et que tu sais que l'élément que tu recherches est directement sous l'élément courrant.
getContentAsString: Retourne la valeur d'un élément sous forme de String. Le normalize n'est pas indispensable. L'avantage de la méthode est de centraliser le décodage d'un contenu (par exemple, il vérifie que le contenu n'est pas null. Mais il pourrait aussi être étendu pour vérifier qu'il n'y a pas un noeud de type 'commentaire'). Sur base de cette méthode on peut écrire d'autres méthodes: getContentAsDate, getContentAsLong, ...
findElementbyAttrib: parcour (et pas crée) une liste d'élément et retourne l'element qui contient la valeur l'attribut recherché.