Seuls les éléments XML contiennent des attributs. Fort de cette constatation, il suffit de tester si le noeud rencontré est un élément et que ce dernier possède des attributs (hasAttributes()). Puis avec la méthode getAttributes() de l'objet Node, une collection NamedNodeMap est obtenue. Cet objet contient des attributs référencés par leur nom. Ainsi, les attributs peuvent être trouvés par leur nom.
NamedNodeMap attributs = noeud.getAttributes(); Node attribut = attributs.getNamedItem("service");
En outre, une itération peut également faire l'affaire pour accéder aux attributs de cette collection
public static void afficherInfos(Node noeud, int niv) { short type = noeud.getNodeType(); String nom = noeud.getNodeName(); String valeur = noeud.getNodeValue(); indenter(niv, type == Node.ELEMENT_NODE); System.out.print(nom + " (" + type + ") = '"); if (valeur != null && !valeur.matches("^\\s+$")) System.out.print(valeur); System.out.println("'"); if ((type == Node.DOCUMENT_NODE || type == Node.ELEMENT_NODE) && noeud.hasChildNodes()) { if (noeud.hasAttributes()) { NamedNodeMap attributs = noeud.getAttributes(); for (int i = 0; i < attributs.getLength(); i++) { Node attribut = attributs.item(i); afficherInfos(attribut, niv + 2); } } NodeList liste = noeud.getChildNodes(); for (int i = 0; i < liste.getLength(); i++) afficherInfos(liste.item(i), niv + 1); } }
Par ailleurs, plusieurs méthodes de l'objet Element permettent de récupérer un attribut ou sa valeur, à l'aide de son nom et éventuellement de son espace de noms. Il s'agît des méthodes getAttribute() et getAttributeNS() ou getAttributeNode() et getAttributeNodeNS() qui retournent respectivement la valeur de l'attribut ou un objet Attr.
NodeList noeuds = document.getElementsByTagName("employe"); for(int i = 0; i < noeuds.getLength(); i++){ Node noeud = noeuds.item(i); Attr service = noeud.getAttributeNode("service"); afficherInfos(service, 0); String id = noeud.getAttribute("id"); System.out.println("ID = " . id); }
La méthode getElementsByTagName() des objets Document et Element retourne une liste de noeuds correspondant au nom passé en argument.
NodeList employes = document.getElementsByTagName("employes"); for(int i = 0; i < employes.getLength(); i++){ Element employe = (Element)employes.item(i); Element nom = employe.getElementsByTagName("nom").item(0); Element prenom = employe.getElementsByTagName("prenom").item(0); }
Si le document possède des attributs ID permettant d'identifier sans ambiguités des éléments, il est possible d'employer la méthode getElementById() afin de récupérer l'élément correspondant à un identificateur passé en argument. Toutefois, le document XML doit être validé par une DTD, un schéma XML ou un schéma Relax NG. En effet, les attributs portant le nom id ne sont pas reconnus comme des identificateurs tant qu'ils n'ont pas été définis avec le type ID dans une DTD ou autres.
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); fabrique.setValidating(true); DocumentBuilder analyseur = fabrique.newDocumentBuilder(); Document document = analyseur.parse("employes.xml"); Element element = document.getElementById("GA1013"); afficherInfos(element, 0);
En cas de suppression de la déclaration DOCTYPE de la source XML, la méthode getElementById() deviendra alors inopérante.
Lors du parcours des attributs d'un élément XML, la méthode isId() des objets Attr, détermine si l'attribut en cours est ou n'est pas un attribut identificateur défini. A l'instar de la méthode getElementById(), le document doit être validé.
Nodelist elements = racine.getElementsByTagName("employes"); for(int i = 0; i < elements.getLength(); i++){ Element element = (Element)elements.item(i); Attr id = element.getAttributeNode("id"); if(id.isId()){ System.out.println("L'attribut est bien un identificateur !"); } }