[XML][DOM]getattribute [Résolu]

siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 2 juin 2005 à 23:08 - Dernière réponse : Akbarr 15 Messages postés mercredi 15 juin 2005Date d'inscription 23 juin 2005 Dernière intervention
- 20 juin 2005 à 10:16
Bonsoir tous !

jai donc ce fichier xml :

<tags>
<tag id="01" name="tag1">
<lenght>taille1</lenght>
<data>value</data>
</tag>
<tag id="02" name="tag2">
<lenght>taille1</lenght>
<data>value</data>
</tag>
</tags>


Je souhaiterai recupéré le name de mon tag(attr name), sachant que je connais l'id(attr id), ainsi que le contenu de la balise lenght et data.

jai commencé a écrire ca mais je men sort pas... si vous pouviez m'aider a recuperer ces informations :

import java.lang.String;
import java.util.HashMap;
import java.util.Vector;
import org.xml.sax.*;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.*;


import java.io.*;


public class XML {


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();


for(int i=0; i<attributs.getLength(); i++)
{
Node numéro = attributs.item(i);
map.put("nom",numéro.getNodeName());
map.put("valeur",numéro.getNodeValue());
attr.addElement(map);
}


return attr;
}


public static HashMap trouveAttribut(Node node)
{
HashMap map = new HashMap();

NamedNodeMap attributs = node.getAttributes();


for(int i=0; i<attributs.getLength(); i++)
{
Node numéro = attributs.item(i);
map.put("nom",numéro.getNodeName());
map.put("valeur",numéro.getNodeValue());
}
return map;
}

public static String findText(Element element)
{
return element.getFirstChild().getNodeValue();

}



public void RechercheXml() {
DOMParser parser = new DOMParser();
String fichier = new String("c:/test/TLVConfiguration.xml");
try
{
parser.parse(fichier);
}
catch (SAXException e)
{
}
catch (IOException e)
{
}

Document document = parser.getDocument();
Element database = document.getDocumentElement();
System.out.println(database);

for (int i = 0; i < database.getLength(); i++)
{
NodeList tag = element.getElementsByTagName("FormatSortie");
}

}
}

Merci a vous ;)
bonne soirée.
Afficher la suite 

20 réponses

Répondre au sujet
Akbarr 15 Messages postés mercredi 15 juin 2005Date d'inscription 23 juin 2005 Dernière intervention - 15 juin 2005 à 15:58
+3
Utile
Hum petit problème de formatage.

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;


public class Test {


public Document readDocument(String fileName)
{
try
{
javax.xml.parsers.DocumentBuilderFactory factory =
javax.xml.parsers.DocumentBuilderFactory.newInstance();


javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new java.io.File(fileName));
}
catch (Exception e)
{
System.out.println("Error loading file: " + fileName);
e.printStackTrace();
return null;
}
}


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


Node textNode = elem.getFirstChild();
return (null == textNode) ? null : textNode.getNodeValue();
}


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();


Document doc = helper.readDocument("c:\\myDoc.xml");


Element root = doc.getDocumentElement();


// 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"));


Element lngElem = helper.getChildElement(elem, "lenght");
System.out.println("Lenght: " + ((null != lngElem) ? helper.getContentAsString(lngElem) : "N/A"));


Element dataElem = helper.getChildElement(elem, "data");
System.out.println("Data: " + ((null != dataElem) ? helper.getContentAsString(dataElem) : "N/A"));
}
else System.out.println("Element Not Found: " + keyToFind);
}
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Akbarr
cs_mep 86 Messages postés vendredi 7 mai 2004Date d'inscription 3 septembre 2008 Dernière intervention - 3 juin 2005 à 10:23
0
Utile
la valeur d'un attribut

=> node.getAttributes().getNamedItem("ID").getNodeValue()
Commenter la réponse de cs_mep
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 4 juin 2005 à 13:44
0
Utile
yop !

oki dok mais le node je le definit ou comment ?
Commenter la réponse de siropipo
JeanPoldeux 64 Messages postés mardi 14 janvier 2003Date d'inscription 5 août 2005 Dernière intervention - 6 juin 2005 à 01:04
0
Utile
//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

org.w3c.dom.NodeList nlObj2 = node.getChildNodes();

for(int j = 0; j < nlObj2.getLength(); j++)
{
//Traiter les noeuds du second niveau

org.w3c.dom.Node node2 = nlObj2.item(i);
String nodeName2 = node2.getNodeName();
String idValue2 = node2.getAttributes().getNamedItem("ID").getNodeValue();

}

}

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.
Commenter la réponse de JeanPoldeux
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 6 juin 2005 à 13:34
0
Utile
Oki dok.

jai fais ca :
protected Document lectureFichier( String fileName )
{
DOMParser parser = new DOMParser( );


try
{
parser.parse(fileName);
}
catch( Exception e )
{
// ERROR ou Warning
return null;
}
return parser.getDocument( );
}

apres de retour dans mon main je fais ca :
Document doc = lectureFichier(fich);
et si je laffiche il me dit ca :
null

C'est pas normal ca? je comprends pourkoi kan je lui demande de trouver un attribut il me leve l'ecxeption NullPointer.
mici a plousse.
Commenter la réponse de siropipo
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 6 juin 2005 à 13:36
0
Utile
le fichier xml est exactement celui la :

<tag id="01" name="Cmd1">
<lenght>taille1</lenght>
<data>value</data>
</tag>
<tag id="02" name="Cmd2">
<lenght>taille1</lenght>
<data>value</data>
</tag>
<tag id="10" name="Cmd3">
<lenght>taille1</lenght>
<data>value</data>
</tag>

il est correctement construit pourtan nan ?
Commenter la réponse de siropipo
JeanPoldeux 64 Messages postés mardi 14 janvier 2003Date d'inscription 5 août 2005 Dernière intervention - 6 juin 2005 à 17:36
0
Utile
@++


<hr>

Every problem has a solution. The difficulty is to find it out.
Commenter la réponse de JeanPoldeux
JeanPoldeux 64 Messages postés mardi 14 janvier 2003Date d'inscription 5 août 2005 Dernière intervention - 6 juin 2005 à 17:44
0
Utile
@++


<hr>

Every problem has a solution. The difficulty is to find it out.
Commenter la réponse de JeanPoldeux
JeanPoldeux 64 Messages postés mardi 14 janvier 2003Date d'inscription 5 août 2005 Dernière intervention - 6 juin 2005 à 17:44
0
Utile
Le xml semble correct. N'as tu pas oublié l'en-tête DOM :


<?xml version="1.0" encoding="ISO-8859-1"?>





Qu'est-ce qui renvoie null ?:


- DOMParser parser = new DOMParser( ); et donc exception à parser.parse(fileName);


ou


- parser.parse(fileName);





Essaie de mettre dans ton catch(Exception e)


e.printStackTrace();


çà peut aider.





Place des affichages consoles avant et après chaque instruction pour voir où tu obtiens null


@++


<hr>

Every problem has a solution. The difficulty is to find it out.
Commenter la réponse de JeanPoldeux
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 6 juin 2005 à 19:16
0
Utile
alors :

ceci renvoie l'erreur nullpointer :
String idName = elemId.getNodeName();

et ceci renvoie null :
Document doc = lectureFichier(fich);
System.out.println(doc);

et enfin ceci renvoi la valeur null :
Element elemId = doc.getElementById(ID);
System.out.println(elemId);

@plousse
Commenter la réponse de siropipo
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 6 juin 2005 à 19:17
0
Utile
jai rajouté lentete... ca ne change rien o fait.

++
Commenter la réponse de siropipo
JeanPoldeux 64 Messages postés mardi 14 janvier 2003Date d'inscription 5 août 2005 Dernière intervention - 6 juin 2005 à 19:44
0
Utile
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.
Commenter la réponse de JeanPoldeux
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 6 juin 2005 à 21:22
0
Utile
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

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

}

C'est quoi ca ?
Commenter la réponse de siropipo
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 8 juin 2005 à 15:03
0
Utile
ma fonction serai mal definit ?
Si vous pouviez m'aider silvousplait ?

merci @ plus
Commenter la réponse de siropipo
JeanPoldeux 64 Messages postés mardi 14 janvier 2003Date d'inscription 5 août 2005 Dernière intervention - 8 juin 2005 à 17:00
0
Utile
Tout est dit dans le message :



protected Document lectureFichier( String fileName )



devrait être



protected Element lectureFichier( String fileName )




et tu auras en retour un élément de l'arbre XML qui est la racine(root)




@++


<hr>

Every problem has a solution. The difficulty is to find it out.
Commenter la réponse de JeanPoldeux
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 10 juin 2005 à 14:17
0
Utile
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;


//ecriture Xml
}
}
//Gérer les exceptions
catch (FileNotFoundException ficin)
{
System.out.println("Exception :" + ficin);
}
catch (IOException ioe)
{
System.out.println("Erreur de lecture");
}
catch (NullPointerException e)
{
e.printStackTrace();
System.out.println("Exception :" + e);
}


}


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
Commenter la réponse de siropipo
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 13 juin 2005 à 11:50
0
Utile
Au secours !!!!

mon parser renvoie toujours document=null !!!

raaahhhhh !

merci.
Commenter la réponse de siropipo
Akbarr 15 Messages postés mercredi 15 juin 2005Date d'inscription 23 juin 2005 Dernière intervention - 15 juin 2005 à 15:03
0
Utile
Pour ton problème de document=null, c'est 'normal' tu utilises la méthode qui prend en paramètre un uri tout en lui passant un simple nom de fichier.

Pour accéder un fichier il faut faire:
org.w3c.dom.Document document = builder.parse(new java.io.File(fileName));


Sinon, voici quelques lignes de code qui lisent le document dans un DOM et extrait les info associées à un ID.

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

public class Test {

public Document readDocument(String fileName)
{
try
{
javax.xml.parsers.DocumentBuilderFactory factory =
javax.xml.parsers.DocumentBuilderFactory.newInstance();

javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new java.io.File(fileName));
}
catch (Exception e)
{
System.out.println("Error loading file: " + fileName);
e.printStackTrace();
return null;
}
}

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

Node textNode = elem.getFirstChild();
return (null == textNode) ? null : textNode.getNodeValue();
}

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();

Document doc = helper.readDocument("c:\\myDoc.xml");

Element root = doc.getDocumentElement();

// 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"));

Element lngElem = helper.getChildElement(elem, "lenght");
System.out.println("Lenght: " + ((null != lngElem) ? helper.getContentAsString(lngElem) : "N/A"));

Element dataElem = helper.getChildElement(elem, "data");
System.out.println("Data: " + ((null != dataElem) ? helper.getContentAsString(dataElem) : "N/A"));
}
else System.out.println("Element Not Found: " + keyToFind);
}
}
Commenter la réponse de Akbarr
siropipo 26 Messages postés vendredi 17 novembre 2000Date d'inscription 21 juin 2005 Dernière intervention - 16 juin 2005 à 20:43
0
Utile
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


Node textNode = elem.getFirstChild();
return (null == textNode) ? null : textNode.getNodeValue();
}



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

merci encor
Commenter la réponse de siropipo
Akbarr 15 Messages postés mercredi 15 juin 2005Date d'inscription 23 juin 2005 Dernière intervention - 20 juin 2005 à 10:16
0
Utile
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é.
Commenter la réponse de Akbarr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.