Who uses XML in 2021? We all use JSON these days, aren’t we? Well, it turns out XML is still being used. These code fragments could help get you up to speed when you’re new to the Java XML API.
Create an empty XML document
To start from scratch, you’ll need to create an empty document:
Document doc = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.newDocument();
Create document from existing file
To load an XML file, use the following fragment.
File source = new File("/location/of.xml");
Document doc = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(target);
Add a new element
Now that we have the document, it’s time to add some elements and attributes. Note that Document and Element are both Nodes.
final Element newNode = doc.createElement(xmlElement.getName());
newNode.setAttribute(attributeName, attributeValue);
node.appendChild(newNode);
Get nodes matching XPath expression
XPath is a powerful way to search your XML document. Every XPath expression can match multiple nodes, or it can match none. Here’s how to use it in Java:
final String xPathExpression = "//node";
final XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodeList = (NodeList) xpath.evaluate(xPathExpression,
doc,
XPathConstants.NODESET);
JSON to XML
JSON is simpler and much more in use these days. However, it has less features than XML. Namespaces and attributes are missing, for example. Usually these aren’t needed, but they can be useful. To convert JSON to XML, you could use the org.json:json dependency. This will create an XML structure similar to the input JSON.
<properties> <org-json.version>20201115</org-json.version> </properties> <dependencies> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>${org-json.version}</version> </dependency> </dependencies>
JSONObject content = new JSONObject(json);
String xmlFragment = XML.toString(content);
Writing XML
When we’re done manipulating the DOM, it’s time to write the XML to file or to a String. The following fragment does the trick
private void writeToConsole(final Document doc)
throws TransformerException{
final StringWriter writer = new StringWriter();
writeToTarget(doc, new StreamResult(writer));
System.out.println(writer.toString());
}
private void writeToFile(final Document doc, File target)
throws TransformerException, IOException{
try (final FileWriter fileWriter = new FileWriter(target)) {
final StreamResult streamResult = new StreamResult(fileWriter);
writeToTarget(doc, streamResult);
}
}
private void writeToTarget(final Document doc, final StreamResult target)
throws TransformerException {
final Transformer xformer = TransformerFactory.newInstance()
.newTransformer();
xformer.transform(new DOMSource(doc), target);
}