2010-12-14 9 views
0

J'ai un modèle fixe de XML et les nœuds peuvent augmenter selon les données. Si j'ai un modèle fixe. Comment itérer tous les nœuds enfants lorsque le nom du nœud parent est fourni? Puis-je créer un fichier XML basé sur xpath?comment faire un fichier XML dynamique en utilisant java

J'ai le code follwoing: -

Map map = hm(); 
      Set set = map.entrySet(); 
      // Get an iterator 
      Iterator it = set.iterator(); 
      // Display elements 
      while(it.hasNext()) { 
       Map.Entry me = (Map.Entry)it.next(); 
       if (check) { 
        xpath_String+= "|"+me.getKey(); 
       }else { 
        xpath_String+= me.getKey(); 
        check = true; 
       }   
      } 

     DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
      domFactory.setNamespaceAware(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder(); 
     //xml file name acts as template 
     Document doc = builder.parse("template.xml"); 


     XPathFactory factory = XPathFactory.newInstance(); 
     XPath xpath = factory.newXPath(); 
     XPathExpression expr = xpath.compile(xpath_String); 
     Object result = expr.evaluate(doc, XPathConstants.NODESET); 
     NodeList nodes = (NodeList) result; 
     System.out.println("Total number of tokens: "+nodes.getLength()); 
     //for (int i = 0; i < nodes.getLength(); i++) { 

     int i=0; 

     StringTokenizer st = new StringTokenizer(xpath_String,"|"); 

     while (st.hasMoreElements()) { 
      String val = (String) st.nextElement(); 
      if(hm().containsKey(val)){ 
       System.out.println("Node value is: "+nodes.item(i).getNodeName()); 
       nodes.item(i).setTextContent(hm().get(val).toString()); 
       i++; 
      } 
     } 
     //} 

     //write the content into xml file 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     // generating the output file name 
     StreamResult finalResult = new StreamResult(new File("newfxml.xml")); 
     transformer.transform(source, finalResult); 

     //making a string for the dom 
     StringWriter writer = new StringWriter(); 
     StreamResult stResult = new StreamResult(writer); 
     transformer.transform(source, stResult); 

Ici, j'ai un modèle fixe et je une carte. à partir de la carte, j'obtiens le xpath et ses valeurs correspondantes. Cela ne vaut que jusqu'à ce qu'aucun des noeuds du template xml ne se répète. Donc, je me demandais s'il y avait un moyen que je peux itérer tout le morceau de nœud xml quand j'obtiens un composant reproductible. Y a-t-il une solution comme celle-ci? Ou je dois changer de façon que j'ai l'intention de procéder ??

+0

Publiez un exemple de votre fichier XML. Alors dis-nous ce que tu as essayé. Alors dites-nous où vous êtes-vous coincé. Alors dites-nous ce que vous voulez vraiment, par exemple. – darioo

+0

Avez-vous un XSD? Si oui, vous pouvez utiliser quelque chose comme XMLBeans. – saugata

+0

non je n'ai pas XSD .. – sanjay

Répondre

1

Si vous souhaitez énumérer tous les enfants d'un noeud, vous devez simplement obtenir votre noeud parent avec quelque chose comme 'Element parent = root.getChild ("parentNodeName")', puis vous pouvez énumérer les enfants avec la même méthode 'Liste children = parent.getChildren ("childName")'.

Document doc = null; 
    SAXBuilder sxb = new SAXBuilder(); 
    try { 
     doc = sxb.build(new File(MyXmlFilePath)); 
    } catch (JDOMException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Element root = doc.getRootElement(); 
    List<Element> nodes = root.getChildren("myNode"); 
    Iterator<Element> it = nodes.iterator(); 
    while(it.hasNext()) 
    { 
     Element currentNode = it.next(); 
     // node treatment here 
    } 

Anhuine.

+0

c'est gud mais mon exigence est de faire un xml selon le modèle fourni. Cela reste valable jusqu'à ce que je reçoive tous les éléments du nœud, mais même si je ne reçois pas l'élément dont j'ai besoin, le nœud doit être renseigné avec une valeur vide. De plus, selon le besoin, la chose complète doit être générique en vertu de laquelle je ne peux pas utiliser directement mentionner la variable de l'élément. – sanjay

Questions connexes