-1

I want to create a XML from a template during runtime in Java using JDOM.

Below is a sample template

<PARENT>
<ISSUES>
<ISSUE id="ISSUE-X">
<SUMMARY></SUMMARY>
<CATEGORY></CATEGORY>
..
</ISSUE>
</ISSUES>
</PARENT>

I want to load this template file using Java + JDOM and get the following

<PARENT>
<ISSUES>
<ISSUE id="ISSUE-1">
<SUMMARY>Test 1</SUMMARY>
<CATEGORY>Cat 1</CATEGORY>      
 ..
</ISSUE>
<ISSUE id="ISSUE-2">
<SUMMARY>Test 2</SUMMARY>
<CATEGORY>Cat 2</CATEGORY>
..
</ISSUE>

</ISSUES>
</PARENT>

Ideally I want to create more ISSUE nodes and fill the data from DB & save to file

Reason I thought I could use Template is because there will be additional nodes under <ISSUE> which I need to fill from db & was thinking filling this via template would be much faster

Can someone guide me on how to get this done in Java using JDOM?

Note: This template will adhere to a XSD which I haven't given here.

Thanks in advance

EDIT: Code snippet below

String sXMLPath = "D:\\WS\\issue_sample.xml";
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
org.w3c.dom.Document doc = dBuilder.parse(new File(sXMLPath));
DOMBuilder domBuilder = new DOMBuilder();
Document xConfigurationDocument;
xConfigurationDocument = domBuilder.build(doc);

XPathFactory xpfac = XPathFactory.instance();       
XPathExpression<Element> xElements = xpfac.compile("//ns:MY-ISSUE/ns:ISSUES",Filters.element(),null,Namespace.getNamespace("ns", "http://www.myns.net/schemas/issue"));
List<Element> elements = xElements.evaluate(xConfigurationDocument);
for (Element xIssuesParent : elements) {
  System.out.println(xIssuesParent.getName());  
  Element xCloneIssue = null ;  
  for (Element xIssueChild : xIssuesParent.getChildren())
  {
      xCloneIssue = xIssueChild.clone();
      System.out.println(xIssueChild.getName());
      xIssuesParent.removeContent(xIssueChild);
  }

  for (int i = 1; i < 3; i++) {         
      xCloneIssue.setAttribute("ID", "ISSUE-" + i);
      xIssuesParent.addContent(xCloneIssue);
  }

}
XMLOutputter xmlOutput = new XMLOutputter(); 
// display nice nice
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(xConfigurationDocument, new FileWriter("c:\\temp\\OutputFile.xml"));

I am trying out this in a sample application

The problem I face is that in the for loop (for (int i = 1; i < 3; i++)) after 1st I always get the following error The Content already has an existing parent "ISSUES"

Obviously what I am missing is a new clone.

My question is how can i always get a handle of an element and keep adding to the parent

KK99
  • 1,971
  • 7
  • 31
  • 64
  • 1
    Please post what code you have tried and where you are struggling – Romski May 22 '13 at 03:56
  • If you have no idea where to start I recommend jdom docs and google. Come post a question when you are shrugging with a specific problem when carrying out the implementation. – Thihara May 22 '13 at 04:16

1 Answers1

0

If it will adhere to an XSD then take a look at org.jdom.input.DOMBuilder which you can parse a DTD into.