2016-10-26 3 views
0

jdom과 부모 자식 관계가있는 중첩 요소를 사용하여 xml을 만들어야합니다. 나는 코드를 작성했지만 xml은 필자의 요구 사항과 일치하지 않습니다. 주석에는 필자가 요구하는 XML 형식이 주석 처리되어 있습니다. 제발 도와주세요 ..자바에서 jdom을 사용하여 xml을 생성하십시오.

내 코드

public static void main(String[] args) throws IOException { 

    Map<String, String> map = new LinkedHashMap(); 
    map.put("webport", "/"); 
    map.put("webserverobsoluteurl", "https://"); 
    map.put("logger.folder", "/opt/apihandler/logs/wsapi"); 
    map.put("logger.port", "9001"); 
    map.put("logger.allowedlevel", "6"); 
    map.put("logpropsfile", "/opt/apihandler/WSAPIHandler/WEB-INF/log4j.properties"); 
    System.out.println(map); 

    Element root = new Element("worldsmart"); 
    Document doc = new Document(); 
    Element pchild = null; 

    for (Map.Entry<String, String> entry : map.entrySet()) { 
     System.out.println(entry.getKey() + "=====================" + entry.getValue()); 

     if (entry.getKey().contains(".")) { 

      int dotIndex = entry.getKey().indexOf("."); 
      String parentTag = entry.getKey().substring(0, dotIndex); 
      String childTag = entry.getKey().substring(dotIndex + 1, entry.getKey().length()); 
      pchild = new Element(parentTag); 
      pchild.addContent(new Element(childTag).setText(entry.getValue())); 
      root.addContent(pchild); 

     } else { 
      Element child = new Element(entry.getKey()); 
      child.addContent(entry.getValue()); 
      root.addContent(child); 
     } 
    } 
    doc.setRootElement(root); 
    XMLOutputter xmloutput = new XMLOutputter(); 
    xmloutput.setFormat(Format.getPrettyFormat()); 
    xmloutput.output(doc, new FileWriter("/root/Desktop/abc.xml")); 
    System.out.println("file saved"); 
} 

필수 출력 :

<worldsmart> 
    <webserverobsoluteurl>https://</webserverobsoluteurl> 
    <webport>/</webport> 
    <logger> 
     <folder>/opt/apihandler/logs/wsapi</folder> 
     <port>9001</port> 
     <allowedlevel>6</allowedlevel> 
    </logger> 
    <logpropsfile> <![CDATA[ /opt/apihandler/WSAPIHandler/WEB-INF/log4j.properties ]]> </logpropsfile> 
</worldsmart> 

하지만 주석에,

<worldsmart> 
    <webport>/</webport> 
    <webserverobsoluteurl>https://</webserverobsoluteurl> 
    <logger> 
     <folder>/opt/apihandler/logs/wsapi</folder> 
    </logger> 
    <logger> 
     <port>9001</port> 
    </logger> 
    <logger> 
     <allowedlevel>6</allowedlevel> 
    </logger> 
    <logpropsfile>/opt/apihandler/WSAPIHandler/WEB-INF/log4j.properties</logpropsfile> 
</worldsmart> 
+0

당신은에 따라 분할됩니다 반복문에'logger' 태그를 여러 번 추가하면됩니다. 먼저 부모 태그를 추가하기 전에 존재하는지 확인하십시오. – kjsebastian

+0

부모 태그를 추가하기 전에 올바른 conscell이지만 로거 태그가 존재하지 않습니다. 내 요구 사항 값이 동적으로 나타납니다. – Shubham

답변

1

@conscells으로 XML 파일을 얻고, 루프에 문제가 무엇인지에 대해 올바른 생각을 가지고 있습니다. 루프 내에서 매번 새로운 logger 요소를 생성하고 있습니다. 이미 존재하는 경우 logger을 재사용하는 대신 (그리고 루프에서 처음으로 생성하는 경우)

귀하의 코드 :

if (entry.getKey().contains(".")) { 

     int dotIndex = entry.getKey().indexOf("."); 
     String parentTag = entry.getKey().substring(0, dotIndex); 
     String childTag = entry.getKey().substring(dotIndex + 1, entry.getKey().length()); 
     pchild = new Element(parentTag); 
     pchild.addContent(new Element(childTag).setText(entry.getValue())); 
     root.addContent(pchild); 

    } 

먼저 pchild 검사에 대한 조건이 있어야합니다. ""

if (entry.getKey().contains(".")) { 

     int dotIndex = entry.getKey().indexOf("."); 
     String parentTag = entry.getKey().substring(0, dotIndex); 
     String childTag = entry.getKey().substring(dotIndex + 1, entry.getKey().length()); 

     // locate the previously created `logger` element, if any. 
     pchild = root.getChild(parentTag); 
     if (pchild == null) { 

      // need to add the child if it did not exist. 
      pchild = new Element(parentTag); 
      root.addContent(pchild); 
     } 
     pchild.addContent(new Element(childTag).setText(entry.getValue())); 

    } 
+0

감사합니다. rolfl .. (: – Shubham

관련 문제