Voila un ensemble de classes qui permettent de parser
un document xml avec DOM et de générer un JTree qui le représente
Vous aurez besoin de Xerces :
http://xml.apache.org
Source / Exemple :
/******* Classe de lancement et d'affichage ***************/
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
public class AffTree extends JFrame
{
public AffTree()
{
super("Dom Tree");
setSize(500,500);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((screenSize.width-getWidth())/2,(screenSize.height-getHeight())/2);
JScrollPane treeView = new JScrollPane(DomTreeMaker.makeTree("abonnes.xml"));
getContentPane().add(treeView);
}
public static void main(String[] args)
{
AffTree a = new AffTree();
a.setVisible(true);
}
}
/************** Classe pour générer l'arbre ****************/
import javax.swing.JTree;
import javax.swing.tree.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Vector;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
/**
*
- Classe qui renvoit un objet JTree représentant la structure d'un fichier
- Xml en le parsant avec DOM
- /
public class DomTreeMaker
{
public static JTree makeTree(String fileName)
{
DOMParser parser = new DOMParser();
try
{
parser.parse(fileName);
}
catch (SAXException e)
{
}
catch (IOException e)
{
}
Document document = parser.getDocument();
Element database = document.getDocumentElement();
DefaultMutableTreeNode top = new DefaultMutableTreeNode(database.getLocalName());
DefaultMutableTreeNode pNiv = new DefaultMutableTreeNode(database.getFirstChild().getNextSibling().getLocalName());
top.add(pNiv);
// On récupère la liste des fils de premier niveau
NodeList premNiv = database.getElementsByTagName(database.getFirstChild().getNextSibling().getLocalName());
// Vector pour stocker le nom des fils
Vector fils = new Vector(1);
// On se positionne sur la première feuille
Node pos = ((Element)premNiv.item(0)).getFirstChild().getNextSibling();
// On ajoute le nom au Vector
fils.addElement(pos.getLocalName());
// Tant qu'on rencontre des noeuds, on descend de 2
// a chaque fois pour eviter les balises fermantes
// et on ajoute au Vector
while ((pos = pos.getNextSibling().getNextSibling()) != null)
fils.addElement(pos.getLocalName());
DefaultMutableTreeNode tIdent,tFils, tVal, tAttr;
// Pour chaque fils de premier niveau
for( int i=0; i<premNiv.getLength(); i++ )
{
// On récupère les attributs
Vector recAttr = DomTools.trouveAttribut((Element)premNiv.item(i),null);
HashMap map;
String nodeName = "";
for (int l = 0 ; l< recAttr.size() ; l++)
{
map = (HashMap) recAttr.get(l);
nodeName += map.get("nom") + " = " + map.get("valeur");
if (l+1 < recAttr.size())
nodeName += " | ";
}
// On ajoute l'attribut du fils (l'identifiant)
tIdent = new DefaultMutableTreeNode(nodeName);
pNiv.add(tIdent);
// Puis pour chaque fils
for (int j=0 ; j<fils.size() ; j++)
{
// On recupère la valeur et le type
String val = DomTools.findText( (Element)premNiv.item(i),(String)fils.get(j) );
Vector attribs = DomTools.trouveAttribut((Element)premNiv.item(i),(String)fils.get(j));
tFils = new DefaultMutableTreeNode(fils.get(j));
tIdent.add(tFils);
DefaultMutableTreeNode attr = new DefaultMutableTreeNode("Attributs");
tFils.add(attr);
// Ajout des attributs
for (int k = 0 ; k < attribs.size() ; k++)
{
map = (HashMap)attribs.get(k);
tAttr = new DefaultMutableTreeNode(map.get("nom") + " = " + map.get("valeur"));
attr.add(tAttr);
}
// Ajout de la valeur du fils
tVal = new DefaultMutableTreeNode(val);
tFils.add(tVal);
}
}
final JTree tree = new JTree(top);
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
return tree;
}
}
/************** Classe utilitaires Dom ********************/
import java.util.HashMap;
import java.util.Vector;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
*
- Outils pour le parser Dom
- /
public class DomTools
{
public static String findText( Element element, String name )
{
Element elementNom = findFirstElement( element, name );
return findText(elementNom );
}
public static String findText(Element element)
{
return element.getFirstChild().getNodeValue();
}
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;
}
}
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.