java.net member

Rechercher dans ce site

Les opérations XML en Java partie 1

>> 04 June 2010

Ce tutoriel utilise le parser fourni avec le JDK. L'installation d'un autre parser n'est pas nécessaire.

Comment utiliser java pour parcourir un document XML et extraire ses éléments. Comment extraire des attributs, le texte d'un élément, etc.

La structure des documents XML
Un document XML est composé principalement d'éléments et texte.


Les composants essentiels d'un document
1.Header
2.Elément racine
3.Eléments enfants

L'élément racine, peut avoir un ou plusieurs éléments (enfants). Un élément peut contenir un élément enfant ou un texte ou les deux. Un élément peut aussi avoir des attributs

XML Header
<?xml version="1,0" encoding="UTF-8"?>

Prenons comme  example un template Eclipse
L'élément racine ici est <templates> (avec s). Un élément enfant est entre <template> et </template>. Un <template> a des attributs (nom/valeur). Le texte pour un template est son contenu.


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<templates>
    <template autoinsert="true" context="catchblock_context" deleted="false"     description="Code in new catch blocks" enabled="true"     id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">
    // ${todo} Auto-generated catch block
    ${exception_var}.printStackTrace();</template>
</templates>

Le parser
Un parser est un programme servant à lire, vérifier et extraire les éléments d'un document XML

Les parsers de Java
DOM parser -> lit un document et forme un arbre de ses éléments
SAX parser -> lance des événements Java au passage des éléments XML

Comment ça marche ?
1-Appelez newDocumentBuilder() sur un objet DocumentBuilderFactory pour avoir
  un objet DocumentBuilder.
 
DocumentBuilderFactory     documentBuilderFactory=DocumentBuilderFactory.newInstance();
  DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();

2-Passez un objet File (On peut aussi utiliser un URL) à la méthode parse. Cette méthode retourne une réference de Document (Le document XML)

  File file=new File("fileName");
  Document document=documentBuilder.parse(file);

3-Avec la référence Document on peut parcourir les éléments XML
  -Elément racine
  -Elément enfants
  -Contenu et attributs



4-(Racine ou root)
  Element root=document.getDocumentElement();

5-Elément enfants
  //NodeList est une collection de Nodes
    NodeList children = root.getChildNodes();
    for (int i = 0; i < children.getLength(); i++)
    {
      
    Node child = children.item(i);
    //get rid of white spaces
    if(child instanceof Element)
     {
        ...
        ...
     }//~if a child is element
    }//~children

6-Et les attributs
  NamedNodeMap attributes=child.getAttributes();
          
  for(int j=0;j<attributes.getLength();j++)
    {
    Node attribute=attributes.item(j);
    if(!(attribute instanceof Node) )
        continue;
    String attributeName=attribute.getNodeName();
    String attributeValue=attribute.getNodeValue();
              
    }//~attributes

7-Beaucoup d'opérations sont disponibles sur des éléments XML
 Par exemple :
  - Obtenir le nom d'un élément : getTagName()
  - L'attribut d'un node en passant son nom : getAttributeNode(String name)
  - Supprimer un attribut en donnant son nom : removeAttribute(String name)
  Consultez Javadoc

Un petit programme
package com.java_javafx.ka;

import java.io.File;
import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

/*
@author Kaesar ALNIJRES
*/

public class Test {
public void test()
{
//parse a file, get root element, children elements and their attributes

try {
    //prepare to read the xml document, by getting a DocumentBuilder
    DocumentBuilderFactory     documentBuilderFactory=DocumentBuilderFactory.newInstance();
    DocumentBuilder      documentBuilder=documentBuilderFactory.newDocumentBuilder();
    File file=new File("put_a_path_to_xml_file");
    Document document=documentBuilder.parse(file);
  
    //get the root element
    Element root=document.getDocumentElement();
  
    //get the root's name
    String string2=root.getTagName();
  
    System.out.println("root "+string2);
  
    //get a list of children
    NodeList children = root.getChildNodes();
    for (int i = 0; i < children.getLength(); i++)
    {
      
        Node child = children.item(i);
        //no white spaces
        if(child instanceof Element)
        {
            //cast a child to Element  
            Element element = (Element) child;
          
            //get the name of the child (element)         
            String childName=element.getTagName();
          
          
            System.out.println("current element "+childName);
            //get the content of the current element
            Text content = (Text) child.getFirstChild();
            String string3=content.getData().trim();
          
          
            System.out.println("content "+string3);
            //Get attributes of the current child
            NamedNodeMap attributes=child.getAttributes();
          
            for(int j=0;j<attributes.getLength();j++)
            {
                Node attribute=attributes.item(j);
                if(!(attribute instanceof Node) )
                    continue;
                String attributeName=attribute.getNodeName();
                String attributeValue=attribute.getNodeValue();
                          
                System.out.println("att "+attributeName+" = "+attributeValue);
            }//~attributes
          
        }//~if a child is element
    }//~children
  
} catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
  

}
public static void main(String[] args) {
    Test t=new Test();
    t.test();
}
}

Templates pour Eclipse (Servez-vous)


J'ai préparé quelques instructions XML, sous forme de templates pour Eclipse, vous permettant d'avoir un peu d'automatisme pour travailler avec des fichiers XML. Les templates sont encore en phase Beta (désolé).Je vais mettre les commentaire en Français prochainement.
Pour utiliser ces templates. Un clic sur le menu "Download" du site. Téléchargez le fichier .zip. Décompressez ce fichier.
Importez le fichier xml dans Eclipse. Dans un éditeur java tappez xml -> puis CTRL+ESPACE. Sélectionnez un template pour l'insérer dans le code.

0 comments:

Post a Comment

  © Blogger template Simple n' Sweet by Ourblogtemplates.com 2009

Back to TOP