[XML][DOM]getattribute

Résolu
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005 - 2 juin 2005 à 23:08
Akbarr Messages postés 15 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 23 juin 2005 - 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.

20 réponses

Akbarr Messages postés 15 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 23 juin 2005 1
15 juin 2005 à 15:58
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);
}
}
3
cs_mep Messages postés 86 Date d'inscription vendredi 7 mai 2004 Statut Membre Dernière intervention 3 septembre 2008 4
3 juin 2005 à 10:23
la valeur d'un attribut

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

oki dok mais le node je le definit ou comment ?
0
JeanPoldeux Messages postés 64 Date d'inscription mardi 14 janvier 2003 Statut Membre Derniè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

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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
6 juin 2005 à 13:34
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.
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
6 juin 2005 à 13:36
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 ?
0
JeanPoldeux Messages postés 64 Date d'inscription mardi 14 janvier 2003 Statut Membre Dernière intervention 5 août 2005
6 juin 2005 à 17:36
@++


<hr>

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


<hr>

Every problem has a solution. The difficulty is to find it out.
0
JeanPoldeux Messages postés 64 Date d'inscription mardi 14 janvier 2003 Statut Membre Dernière intervention 5 août 2005
6 juin 2005 à 17:44
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.
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
6 juin 2005 à 19:16
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
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 juin 2005
6 juin 2005 à 19:17
jai rajouté lentete... ca ne change rien o fait.

++
0
JeanPoldeux Messages postés 64 Date d'inscription mardi 14 janvier 2003 Statut Membre Derniè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.
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 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

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

}

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

merci @ plus
0
JeanPoldeux Messages postés 64 Date d'inscription mardi 14 janvier 2003 Statut Membre Dernière intervention 5 août 2005
8 juin 2005 à 17:00
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.
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 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;


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

mon parser renvoie toujours document=null !!!

raaahhhhh !

merci.
0
Akbarr Messages postés 15 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 23 juin 2005 1
15 juin 2005 à 15:03
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);
}
}
0
siropipo Messages postés 26 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 21 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


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
0
Akbarr Messages postés 15 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 23 juin 2005 1
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é.
0
Rejoignez-nous