在 Java 中解析 XML 并动态添加节点,可以使用 `javax.xml.parsers` 和 `org.w3c.dom` 包来处理 DOM(文档对象模型)。以下是一个示例代码,展示如何解析给定的 XML 文件,找到 `` 节点,并动态添加多个 `` 子节点。
### 1. 使用 DOM 解析器解析 XML
### 2. 动态添加 `` 节点
### 3. 将修改后的 XML 保存或输出
```java
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
public class XMLParserExample {
public static void main(String[] args) {
try {
// 1. 创建DocumentBuilderFactory和DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 2. 加载并解析XML文件
File xmlFile = new File("input.xml"); // 假设你的XML文件名为input.xml
Document document = builder.parse(xmlFile);
document.getDocumentElement().normalize();
// 3. 获取< IMAGES >节点
NodeList imagesNodes = document.getElementsByTagName("IMAGES");
if (imagesNodes.getLength() == 0) {
System.out.println("未找到< IMAGES >节点");
return;
}
Element imagesElement = (Element) imagesNodes.item(0);
// 4. 动态添加< image >子节点
for (int i = 1; i <= 5; i++) { // 假设要添加5个< image >节点
Element imageElement = document.createElement("image");
imageElement.setTextContent(String.format("%03d", i)); // 格式化为001, 002, ...
imagesElement.appendChild(imageElement);
}
// 5. 将修改后的XML保存到文件或输出
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File("output.xml")); // 输出到output.xml
transformer.transform(source, result);
System.out.println("XML文件已成功更新并保存到output.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
### 代码说明:
1. **加载和解析 XML**:使用 `DocumentBuilder` 来解析 XML 文件,并将其转换为 `Document` 对象。
2. **获取 `` 节点**:通过 `getElementsByTagName` 方法获取所有名为 `` 的节点,并确保它存在。
3. **动态添加 `` 节点**:使用 `createElement` 创建新的 `` 元素,并使用 `setTextContent` 设置其文本内容。然后将这些元素添加到 `` 节点中。
4. **保存修改后的 XML**:使用 `Transformer` 将修改后的 `Document` 对象写入到新的 XML 文件中。
### 注意事项:
- 如果你不需要保存到文件,可以直接将 `StreamResult` 替换为 `StreamResult consoleResult = new StreamResult(System.out);`,这样会将修改后的 XML 输出到控制台。
- 如果你的 XML 文件较大,建议使用 SAX 或 StAX 解析器,因为 DOM 解析器会将整个 XML 文件加载到内存中,可能会导致性能问题。
### 扩展:
如果你需要根据某些条件动态生成 `` 节点的内容,可以在循环中加入逻辑判断,或者从外部数据源(如数据库、API 等)获取数据。