0

I need to create xml using jdom with nested element with parent child relation. I have written code but xml not match with my requirement.In comment i have commented my required xml format. Please help me..

my code is

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

Required output:

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

but I am getting XML file as

<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>
2
  • You are splitting based on "." and adding the logger tag multiple times in the loop. Check whether it exists first before adding the parent tag Commented Oct 26, 2016 at 6:34
  • you are right conscells but logger tag not exists before adding the parent tag.In my requirement values are coming dynamically. Commented Oct 26, 2016 at 6:48

1 Answer 1

1

@conscells, in a comment, has the right idea for what the problem is in your loops - you are creating a new logger element each time in the loop, instead of reusing the logger if it already exists (and creating it the first time in the loop).

Your code:

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

    }

should have a condition for checking for the pchild first:

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

    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.