В этом руководстве показано, как использовать встроенный в Java анализатор DOM для изменения XML-файла.
Содержание
- 1. XML-файл, до и после
- 2. Анализатор Dom изменяет XML-файл
- 3. Скачать Исходный Код
- 4. Рекомендации
P.S Протестирован с Java 11.
Примечание Пожалуйста, прочитайте DOM-анализ XML и DOM пишет XML .
1. XML-файл, до и после
Исходный XML-файл.
mkyong support yflow admin
Позже мы будем использовать синтаксический анализатор DOM для изменения следующих XML-данных.
Для удостоверения личности сотрудника 1001
- Удалите XML-элемент
имя. - Для элемента XML
рольобновите значение до “основатель”.
Для удостоверения личности сотрудника 1002
- Обновите атрибут XML до
2222. - Добавьте новый XML-элемент
зарплата, содержащий атрибут и значение. - Добавьте новый XML-комментарий.
- Переименуйте XML-элемент из
имявn(удалите и добавьте).
Ниже приведен окончательный измененный XML-файл.
founder admin 1000 yflow
2. Анализатор Dom изменяет XML-файл
Ниже приведен пример синтаксического анализатора DOM для получения исходного XML-файла staff-simple.xml , измените XML и сгенерируйте измененный XML-файл staff-modified.xml .
package com.mkyong.xml.dom;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.transform.stream.StreamSource;
import java.io.*;
public class ModifyXmlDomParser {
private static final String FILENAME = "src/main/resources/staff-simple.xml";
// xslt for pretty print only, no special task
private static final String FORMAT_XSLT = "src/main/resources/xslt/staff-format.xslt";
public static void main(String[] args) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try (InputStream is = new FileInputStream(FILENAME)) {
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(is);
NodeList listOfStaff = doc.getElementsByTagName("staff");
//System.out.println(listOfStaff.getLength()); // 2
for (int i = 0; i < listOfStaff.getLength(); i++) {
// get first staff
Node staff = listOfStaff.item(i);
if (staff.getNodeType() == Node.ELEMENT_NODE) {
String id = staff.getAttributes().getNamedItem("id").getTextContent();
if ("1001".equals(id.trim())) {
NodeList childNodes = staff.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node item = childNodes.item(j);
if (item.getNodeType() == Node.ELEMENT_NODE) {
if ("role".equalsIgnoreCase(item.getNodeName())) {
// update xml element `role` text
item.setTextContent("founder");
}
if ("name".equalsIgnoreCase(item.getNodeName())) {
// remove xml element `name`
staff.removeChild(item);
}
}
}
// add a new xml element, address
Element address = doc.createElement("address");
// add a new xml CDATA
CDATASection cdataSection =
doc.createCDATASection("HTML tag testing");
address.appendChild(cdataSection);
staff.appendChild(address);
}
if ("1002".equals(id.trim())) {
// update xml attribute, from 1002 to 2222
staff.getAttributes().getNamedItem("id").setTextContent("2222");
// add a new xml element, salary
Element salary = doc.createElement("salary");
salary.setAttribute("currency", "USD");
salary.appendChild(doc.createTextNode("1000"));
staff.appendChild(salary);
// rename a xml element from `name` to `n`
// sorry, no API for this, we need to remove and create
NodeList childNodes = staff.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node item = childNodes.item(j);
if (item.getNodeType() == Node.ELEMENT_NODE) {
if ("name".equalsIgnoreCase(item.getNodeName())) {
// Get the text of element `name`
String name = item.getTextContent();
// remove xml element `name`
staff.removeChild(item);
// add a new xml element, n
Element n = doc.createElement("n");
n.appendChild(doc.createTextNode(name));
// add a new comment
Comment comment = doc.createComment("from name to n");
staff.appendChild(comment);
staff.appendChild(n);
}
}
}
}
}
}
// output to console
// writeXml(doc, System.out);
try (FileOutputStream output =
new FileOutputStream("c:\\test\\staff-modified.xml")) {
writeXml(doc, output);
}
} catch (ParserConfigurationException | SAXException
| IOException | TransformerException e) {
e.printStackTrace();
}
}
// write doc to output stream
private static void writeXml(Document doc,
OutputStream output)
throws TransformerException, UnsupportedEncodingException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// The default add many empty new line, not sure why?
// https://mkyong.com/java/pretty-print-xml-with-java-dom-and-xslt/
// Transformer transformer = transformerFactory.newTransformer();
// add a xslt to remove the extra newlines
Transformer transformer = transformerFactory.newTransformer(
new StreamSource(new File(FORMAT_XSLT)));
// pretty print
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(output);
transformer.transform(source, result);
}
}
Вывод – измененный XML-файл.
founder admin 1000 yflow
3. Скачать Исходный Код
$клон git $клон git
$компакт-диск java-xml
$cd src/основной/java/com/mkyong/xml/дом/
4. Рекомендации
- Википедия – Java API для обработки XML
- Википедия – Объектная модель документа
- Объектная модель Oracle – Документа
- Как читать XML–файл на Java – (DOM-анализатор)
- Как читать XML–файл на Java – (синтаксический анализатор SAX)
- Примеры XML и XSLT синтаксического анализатора Java DOM
- Красивая печать XML с Java Dom и XSLT
- Пример JAXB привет, мир
Оригинал: “https://mkyong.com/java/how-to-modify-xml-file-in-java-dom-parser/”