2012-06-11 3 views
0

고정 된 형식이없는 XML이 있습니다. org.w3c.dom을 사용하여 동일한 XML에 값을 동적으로 설정하는 다음 코드가 있습니다.jdom을 사용하여 xml에 동적으로 값을 설정합니다.

public String generateXML(String[] tags,String[] tagValues,String xmlfilePath){ 
     String strXML = ""; 

     try{ 

      if(tags == null || tagValues == null || xmlfilePath == null){ 


      }else{ 


       File file = new File(xmlfilePath); 

       if (file.exists()){ 

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder(); 
        org.w3c.dom.Document doc = builder.parse(file); 

        NodeList nodeList = doc.getElementsByTagName("*"); 

        int k =0; 
        for (int i=0; i<nodeList.getLength(); i++) { 

         Node node = (Node)nodeList.item(i); 

         if(node.getNodeName().trim().equalsIgnoreCase(tags[k])){ 
          node.setTextContent(tagValues[k]); 
          k++; 
         } 
        } 

        DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); 
        LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
        strXML = lsSerializer.writeToString(doc); 

       }else{ 

       } 
      } 

     }catch (Exception e) { 
      e.printStackTrace(); 

     } 


     return strXML; 
    } 

그러나 이전 버전의 JDK에서는 작동하지 않으므로 JDOM에서도 동일한 작업을 수행하려고합니다.

어떻게 가능합니까? 각 예제는 태그 이름이 필요하지만 일반적인 방법을 만들고 싶습니다.

+1

이전 버전의 JDK? 몇 살 ? JDOM이 해당 JDK 버전을 지원하는지 확인하십시오. – Rakesh

+0

예 jDOM을 지원합니다 – chetan

답변

0

는 지금까지 내가, 즉석,이 두 가지 방법 '같은 일'할 것입니다 말할 수 : 당신은 '오래된'JDK를 사용하려면 이후

내가 JDOM 1.x에서 사용하고을 (내가 미리 가정 Java5) ....

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.jdom.Document; 
import org.jdom.Element; 
import org.jdom.JDOMException; 
import org.jdom.filter.ElementFilter; 
import org.jdom.input.SAXBuilder; 
import org.jdom.output.XMLOutputter; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.ls.DOMImplementationLS; 
import org.w3c.dom.ls.LSSerializer; 
import org.xml.sax.SAXException; 

public class DOMJDOM { 

    /** 
    * @param args 
    * @throws ParserConfigurationException 
    * @throws IOException 
    * @throws SAXException 
    */ 
    public static String dom(File file, String[] tags, String[] tagValues) throws ParserConfigurationException, SAXException, IOException { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     org.w3c.dom.Document doc = builder.parse(file); 

     NodeList nodeList = doc.getElementsByTagName("*"); 

     int k =0; 
     for (int i=0; i<nodeList.getLength(); i++) { 

      Node node = (Node)nodeList.item(i); 

      if(node.getNodeName().trim().equalsIgnoreCase(tags[k])){ 
       node.setTextContent(tagValues[k]); 
       k++; 
      } 
     } 

     DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); 
     LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
     return lsSerializer.writeToString(doc); 
    } 

    /** 
    * @param args 
    * @throws IOException 
    * @throws JDOMException 
    */ 
    public static String jdom(File file, String[] tags, String[] tagValues) throws JDOMException, IOException { 
     SAXBuilder saxfac = new SAXBuilder(); 
     Document doc = saxfac.build(file); 

     Iterator<?> it = doc.getDescendants(new ElementFilter()); 
     int k =0; 
     while (it.hasNext()) { 

      Element emt = (Element)it.next(); 

      if(emt.getName().equalsIgnoreCase(tags[k])){ 
       emt.setText(tagValues[k]); 
       k++; 
      } 
     } 

     XMLOutputter xout = new XMLOutputter(); 
     return xout.outputString(doc); 
    } 
} 
+0

논리가 맞지만 java.util.ConcurrentModificationException을 던졌습니다 – chetan

+0

예, 바보 같아요 .... .... 반복자를 바꿀 수 없으며 반복기 밖에서 수정할 수 있습니다. 반복자는 다른 것입니다. – rolfl