2009-04-15 9 views
0

Quel est le moyen le plus efficace pour résoudre ce problème: J'ai parcouru un fichier XML et créé l'ensemble suivant des listes chaînées (String):Java: traversèrent Arbre à arbre

  • a> b> c
  • a> b> d
  • a> f> [i]

et maintenant je suis en train de reconstruire le XML dans sa structure originale:

<a> 
<b> 
    <c/><d/> 
</b> 
<f>i</f> 
</a> 

Toute aide serait vraiment appréciée!

Répondre

3

Vous ne voulez probablement pas utiliser les listes comme structure de données pour cela. Il vaudrait peut-être mieux créer un type Node ou quelque chose de similaire, qui peut contenir du texte et des nœuds enfants, afin que vous puissiez stocker les données dans une arborescence/hiérarchie de nœuds. Quelque chose de simple comme cela devrait faire l'affaire:

public class Node { 
    private String text; 
    private List<Node> children = new ArrayList<Node>(); 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public List<Node> getChildren() { 
     return children; 
    } 

} 

Il devrait alors être trivial de créer un arbre de ces Node s lorsque vous lisez dans le fichier, et d'utiliser la même structure pour l'écrire arrière.

0

Vous devez stocker plus d'informations sur la structure du fichier XML d'origine. Ces 3 listes ne contiennent pas d'informations sur l'ordre des nœuds enfants, par exemple.

0

J'utiliserais une structure de données arborescente pour contenir les éléments dans la première étape (comme mat explique here).

Et votre représentation n'est pas claire pour moi, comment faites-vous la distinction entre une étiquette et un élément? Depuis i est détenu dans les mêmes listes comme une étiquette, mais n'est pas une étiquette.

0

Un ensemble ne conserve pas l'ordre des documents. Vous voulez garder une trace de la structure arborescente dans un codage tabulaire basé sur une plage (pre/post/size/level/kind) ou quelque chose le long des lignes, un schéma basé sur un préfixe comme ORDPATH ou basé sur des pointeurs comme par exemple un codage parent/leftsibl/rightsibl/firstchild/node.