2010-12-14 63 views
0

我有一個固定的XML模板,並且每個數據的節點可能會增加。 如果我有一個固定的模板。如何在提供父節點名稱時迭代所有子節點? 我可以根據xpath製作XML嗎?如何使用java製作動態xml

我都有以下代碼: -

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); 

在這裏,我有一個固定的模板,我的地圖。從地圖上我得到了xpath及其相應的值。這隻適用於模板xml中沒有任何節點重複自身。所以我想知道是否有任何方法可以迭代整個xml節點塊,當我得到一個可重複的組件。 有沒有這樣的解決方案? 或者我需要改變方式我打算繼續?

+0

發佈您的xml示例。然後告訴我們你有什麼嘗試。然後告訴我們你卡在哪裏了。然後通過例子告訴我們你真正想要的東西。 – darioo 2010-12-14 09:30:55

+0

你有XSD嗎?如果是這樣,你可以使用類似XMLBeans的東西。 – saugata 2010-12-14 09:35:17

+0

不,我沒有XSD .. – sanjay 2010-12-14 09:48:52

回答

1

如果你想枚舉一個節點的所有子節點,你只需要讓你的父節點具有類似'Element parent = root.getChild(「parentNodeName」)''那麼你可以使用相同的方法來枚舉子節點'列出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 
    } 

Anhuin。

+0

這是gud,但我的要求是根據提供的模板製作一個xml。這一直持續到我得到節點的所有元素,但即使我沒有得到我需要用空值來填充節點的元素。此外,根據需要,完整的東西需要是通用的,我不能直接使用它提及元素的標記名。 – sanjay 2010-12-15 05:34:40