2012-10-10 2 views
4

J'ai rencontré un problème en développant sur Blackberry. J'utilise l'API KXML2 pour l'analyse XML (en fait, j'ai le code de quelqu'un d'autre pour continuer et corriger, donc je dois l'utiliser). Le problème est le manque de clonage en java moi, et im ayant quelques difficultés en essayant de copier en profondeur un nœud. (Je ne veux pas entrer dans les détails, mais le point est, que j'ai besoin de substituer des données dans des points spécifiques d'un HTML et il y a un descripteur xml pour cela) Alors ..! :)copie profonde du noeud avec kxml (java me)

XMLElement childNode = node.getElement(ci); 

Ceci est l'élément que je dois copier. XMLElement est une classe de wrapper simple, peu importe, elle contient l'attribut Element et quelques méthodes utiles.

Maintenant, ce que je veux est un peu comme quelque chose comme ceci:

XMLElement newChildNode = childNode.clone(); 

Comme il n'y a pas de clonage, pas d'interface clonable en Java ME, je ne peux pas le faire, et cela ne crée une référence à l'original élément, je dois préserver, tout en modifiant le nouvel élément:

XMLElement newChildNode = childNode; 

quelqu'un peut-il trouver une idée utile au sujet, comment créer une copie en profondeur de mon élément childNode? Merci beaucoup d'avance!

Répondre

1

J'ai réussi à résoudre le problème avec cette fonction utilitaire simple. Il parcourt simplement les attributs, les copie et appelle récursivement la fonction si nécessaire.

public static Element createClone(Element toClone) { 


      String namespace = (toClone.getNamespace() == null) ? "" : toClone.getNamespace(); 
      String name = (toClone.getName() == null) ? "" : toClone.getName(); 

      Element result = toClone.createElement(namespace, name); 

      int childCount = toClone.getChildCount(); 
      int attributeCount = toClone.getAttributeCount(); 

      for (int i = 0; i < attributeCount; i++) { 

       result.setAttribute(toClone.getAttributeNamespace(i), toClone.getAttributeName(i), toClone.getAttributeValue(i)); 
      }      

      for (int j = 0; j < childCount; j ++) { 

        Object childObject = toClone.getChild(j); 
        int type = toClone.getType(j); 

        if (type == Node.ELEMENT) { 

          Element child = (Element) childObject; 
          result.addChild(Node.ELEMENT, createClone(child)); 

        } else if (type == Node.TEXT) { 

         String childText = new String((String) childObject); 

         if (!childText.equals("")) { 
          result.addChild(Node.TEXT, childObject); 
         } 

        } 
       } 


      return result; 
     }