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); // 递归排序子节点
}
}
}

 

posted @ 2025-07-05 04:38  真栋哥  阅读(11)  评论(0)    收藏  举报