3

I am trying to save nodeList node that contains XML as a new file, here is the Node list that get a new XML doc and split to smaller XMLs:

public void split(Document inDocument) throws ParserConfigurationException,
            SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        SaveXML savePerJob = new SaveXML();
        // Load the input XML document, parse it and return an instance of the
        // Document class.
        Document document = inDocument;
        //all elements
        //jobs
        NodeList nodes = document.getDocumentElement().getChildNodes();
        NodeList jobs = nodes.item(7).getChildNodes();
        for(int j =0; j<jobs.getLength(); j++){
            Node itm = jobs.item(j);
            String itmName = itm.getFirstChild().getNodeName();
            String itmID = itm.getFirstChild().getTextContent();
            System.out.println("name: " + itmName + " value: " + itmID);
            //here I want to save the node as a new .xml file
        }
    }

the output is a long list like :

name: id value: 9496425

Now I want to save the node itm as new new .xml file and I didnt find the function that returns the node as is. Thanks.

potame
  • 7,597
  • 4
  • 26
  • 33
Itsik Mauyhas
  • 3,824
  • 14
  • 69
  • 114

2 Answers2

17

You can convert your node to a string and save this string into a .xml file.

Convert a node to string

The method below will turn a node into an xml string. It's a JDK only solution, no dependencies required.

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.StringWriter;

public static String toString(Node node, boolean omitXmlDeclaration, boolean prettyPrint) {
    if (node == null) {
        throw new IllegalArgumentException("node is null.");
    }

    try {
        // Remove unwanted whitespaces
        node.normalize();
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr = xpath.compile("//text()[normalize-space()='']");
        NodeList nodeList = (NodeList)expr.evaluate(node, XPathConstants.NODESET);

        for (int i = 0; i < nodeList.getLength(); ++i) {
            Node nd = nodeList.item(i);
            nd.getParentNode().removeChild(nd);
        }

        // Create and setup transformer
        Transformer transformer =  TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        
        if (omitXmlDeclaration == true) {
           transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        }

        if (prettyPrint == true) {
           transformer.setOutputProperty(OutputKeys.INDENT, "yes");
           transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
        }

        // Turn the node into a string
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(node), new StreamResult(writer));
        return writer.toString();
    } catch (TransformerException e) {
        throw new RuntimeException(e);
    } catch (XPathExpressionException e) {
        throw new RuntimeException(e);
    }
}
Community
  • 1
  • 1
Stephan
  • 41,764
  • 65
  • 238
  • 329
1

Here is one possibility:

void save(Node node, OutputStream stream) throws Exception {
    DOMImplementationLS ls = (DOMImplementationLS) node.getOwnerDocument().getImplementation();
    LSOutput out = ls.createLSOutput();
    out.setByteStream(stream);
    LSSerializer ser = ls.createLSSerializer();
    ser.write(node, out);
}

Perhaps you should make sure that node is really an Element, but I leave that as an excersize.

forty-two
  • 12,204
  • 2
  • 26
  • 36
  • if node wasn't a element I couldn't return its ID – Itsik Mauyhas Nov 26 '15 at 10:55
  • Perhaps, but you do not have any checks that you are dealing with an element. And in all, your code is very sensitive to format changes in the input document, but that's another story. – forty-two Nov 26 '15 at 10:58