XML 按属性值排序
<!-- 如果使用 JDK 11+ 的较新 DOM 实现(可选) -->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxp-api</artifactId>
<version>1.4.2</version>
</dependency>
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;
import java.util.*;
public class XmlSorter {
public static void main(String[] args) throws Exception {
// 1. 读取 XML 文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("input.xml"));
// 2. 从根节点开始递归排序
sortChildNodesById(doc.getDocumentElement());
// 3. 输出排序后的 XML
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc), new StreamResult(new File("output.xml")));
}
// 递归按 id 排序子节点
private static void sortChildNodesById(Element parent) {
NodeList children = parent.getChildNodes();
List<Element> elementList = new ArrayList<>();
// 收集所有元素节点(跳过文本节点等)
for (int i = 0; i < children.getLength(); i++) {
if (children.item(i) instanceof Element) {
elementList.add((Element) children.item(i));
}
}
// 按 id 属性排序
elementList.sort(Comparator.comparing(e -> e.getAttribute("id")));
// 移除原有子节点
while (parent.hasChildNodes()) {
parent.removeChild(parent.getFirstChild());
}
// 重新添加排序后的子节点(递归处理子节点的子节点)
for (Element child : elementList) {
parent.appendChild(child);
sortChildNodesById(child); // 递归排序子节点
}
}
}

浙公网安备 33010602011771号