Consider the XML file, Report.xml :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report FileName="abc.bin" reportDate="05/12/2016 02:44:22 AM">
<Statistics>
<child value="abc">
<subchild>...</subchild>
</child>
<child value="xyz">
<subchild>...</subchild>
</child>
</Statistics>
<Properties>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</childn>
</Properties>
<OverallStatistics>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</child1>
</OverallStatistics>
</Report>
I just want to split the above XML file as:
ReportSplit1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report FileName="abc.bin" reportDate="05/12/2016 02:44:22 AM">
<Statistics>
<child value="abc">
<subchild>...</subchild>
</child>
</Statistics>
<Properties>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</childn>
</Properties>
<OverallStatistics>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</child1>
</OverallStatistics>
</Report>
ReportSplit2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report FileName="abc.bin" reportDate="05/12/2016 02:44:22 AM">
<Statistics>
<child value="xyz">
<subchild>...</subchild>
</child>
</Statistics>
<Properties>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</childn>
</Properties>
<OverallStatistics>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</child1>
</OverallStatistics>
</Report>
i.e. retaining the parent node's attributes and retaining the sibling nodes. The split should be made only on the children in Statistics node.
Followed the workaround given in the link by changing the snippet as
package xmlsplitting;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.*;
public class XmlSplit
{
static public void main(String[] arg) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("D:\\Analyzer\\FileSplit\\Report.xml");
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList list = (NodeList)xpath.evaluate("//Report/Statistics/child", doc, XPathConstants.NODESET);
for (int i=1; i<list.getLength(); i++)
{
Node element = list.item(i).cloneNode(true);
if(element.hasChildNodes())
{
Source src = new DOMSource(element);
FileOutputStream fs = new FileOutputStream( "D:\\Analyzer\\FileSplit\\ReportSplit"+ i + ".xml");
Result dest = new StreamResult(fs);
aTransformer.transform(src, dest);
fs.close();
}
}
}
}
The achieved XML files splits are:
ReportSplit1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<child value="abc">
<subchild>...</subchild>
</child>
ReportSplit2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<child value="xyz">
<subchild>...</subchild>
</child>
Could anyone provide a workaround to achieve the desired XML files splits?