HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Converting partial XML (Node List) to a String

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
nodexmlpartialconvertingliststring

Problem

I have a need to extract a part of XML tree (everything under root) and convert it to a string. (The result string will be later pasted inside XSL-FO XSLT file.)

The above functionality is a part of Java 6 application. I use org.w3c.dom and javax.xml.transform. Still in the debugging process.

// ...

// Extract all child notes of root from foDoc
// and convert the result to String
Node root = foDoc.getElementsByTagNameNS("*","root").item(0);
NodeList body = root.getChildNodes();
String foResult;

try {
    foResult = nodeListToString(body);
} catch (TransformerException e) {
    logger.error(e);

    foResult = "";
}
// ...


private static String nodeListToString(NodeList nodes) throws TransformerException {
    StringBuilder result = new StringBuilder();
    int len = nodes.getLength();
    for(int i = 0; i < len; ++ i) {
        result.append(nodeToString(nodes.item(i)));
    }
    return result.toString();
}

private static String nodeToString(Node node) throws TransformerException {
    StringWriter buf = new StringWriter();
    Transformer xform = TransformerFactory.newInstance().newTransformer();
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    xform.transform(new DOMSource(node), new StreamResult(buf));
    return(buf.toString());
}


My questions:

-
Assuming that there will always be exactly one root node, how reliable is my code in extracting everything under it?

-
Am I missing any edge cases?

-
Anything just plain wrong?

Please disregard any exception handling inadequacies.

Edited on 10/06/2015

Since my originally posted code had a "just plain wrong" part, I've fixed it. There were no answers based on the old code.

Solution

Reading the documentation for
Transformer,
where it says:


A Transformer may be used multiple times. Parameters and output
properties are preserved across transformations.

, I'd say that not only can the Transformer object be reused across
multiple nodes, but you should also be able to use a single
StringWriter instead of recreating it for every node; same goes for
the DOMSource actually:

private static String nodeListToString(NodeList nodes) throws TransformerException {
DOMSource source = new DOMSource();
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

for (int i = 0; i

That said, I'm only guessing that this should work.

Also, the
len` variable is probably going to be inlined automatically
anyway, though you could check that with a disassembler just to be sure
(it wouldn't make that much of a difference I suspect).

Otherwise looks good to me; if you've tested it with all kinds of node types and the output looks good, then I'd say that should work IMHO.

Context

StackExchange Code Review Q#106480, answer score: 5

Revisions (0)

No revisions yet.