给我一段 java 代码,实现功能是比对两个 xml 格式文件,生成 比对 差异的 xml格式文件,差异的新增用 <value='add'>表示,修改用 <value='modify'> 表示, 删除用 <value='del'> 表示
时间: 2023-09-11 17:05:05 浏览: 110
### 回答1:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class XmlCompare {
public static void main(String[] args) throws Exception {
// 读取文件
File file1 = new File("xml1.xml");
File file2 = new File("xml2.xml"); // 解析文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc1 = db.parse(file1);
Document doc2 = db.parse(file2); // 建立对比文件
Document doc3 = db.newDocument();
Element rootElement = doc3.createElement("root");
doc3.appendChild(rootElement); // 开始对比
compareXml(doc1.getDocumentElement(), doc2.getDocumentElement(), rootElement); // 写入文件
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer(); DOMSource source = new DOMSource(doc3);
FileOutputStream out = new FileOutputStream("difference.xml");
StreamResult result = new StreamResult(out); tf.transform(source, result);
out.close();
} public static void compareXml(Element element1, Element element2, Element rootElement) {
// 对比element1和element2的所有属性
if(!compareElement(element1, element2, rootElement)) {
// 如果不相等,则把element1的内容记录下来
Element element = rootElement.getOwnerDocument().createElement("value");
element.setAttribute("type", "modify");
element.setAttribute("name", element1.getNodeName());
element.setAttribute("value", element1.getTextContent());
rootElement.appendChild(element);
} // 对比element1和element2的子节点
NodeList nodeList1 = element1.getChildNodes();
NodeList nodeList2 = element2.getChildNodes();
for (int i = 0; i < nodeList1.getLength(); i++) {
Node node1 = nodeList1.item(i);
if (node1.getNodeType() == Node.ELEMENT_NODE) {
Element e1 = (Element) node1;
Node node2 = findNode(nodeList2, e1.getNodeName());
if (node2 != null) {
Element e2 = (Element) node2;
compareXml(e1, e2, rootElement);
} else {
// 如果element2中没有找到,则记录下来
Element element = rootElement.getOwnerDocument().createElement("value");
element.setAttribute("type", "add");
element.setAttribute("name", e1.getNodeName());
element.setAttribute("value", e1.getTextContent());
rootElement.appendChild(element);
}
}
} // 对比element2中多余的节点
for (int i = 0; i < nodeList2.getLength(); i++) {
Node node2 = nodeList2.item(i);
if (node2.getNodeType() == Node.ELEMENT_NODE) {
Element e2 = (Element) node2;
Node node1 = findNode(nodeList1, e2.getNodeName());
if (node1 == null) {
Element element = rootElement.getOwnerDocument().createElement("value");
element.setAttribute("type", "del");
element.setAttribute("name", e2.getNodeName());
element.setAttribute("value", e2.getTextContent());
rootElement.appendChild(element);
}
}
}
} public static boolean compareElement(Element element1, Element element2, Element rootElement) {
if (!element1.getNodeName().equals(element2.getNodeName()) || !element1.getTextContent().equals(element2.getTextContent())) {
return false;
}
return true;
} public static Node findNode(NodeList nodeList, String nodeName) {
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeName().equals(nodeName)) {
return node;
}
}
return null;
}
}
### 回答2:
以下是一个简单的 Java 代码示例,用于比对两个 XML 格式文件并生成差异的 XML 格式文件。差异的新增用 `<value='add'>` 表示,修改用 `<value='modify'>` 表示,删除用 `<value='del'>` 表示。
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class XmlComparator {
public static void main(String[] args) {
String oldXmlPath = "old.xml"; // 原始XML文件路径
String newXmlPath = "new.xml"; // 新XML文件路径
String diffXmlPath = "diff.xml"; // 差异XML文件输出路径
compareXml(oldXmlPath, newXmlPath, diffXmlPath);
}
public static void compareXml(String oldXmlPath, String newXmlPath, String diffXmlPath) {
try {
Document oldDocument = parseXmlFile(oldXmlPath);
Document newDocument = parseXmlFile(newXmlPath);
Document diffDocument = DocumentHelper.createDocument();
Element rootElement = diffDocument.addElement("diff");
compareElements(oldDocument.getRootElement(), newDocument.getRootElement(), rootElement);
saveXmlFile(diffDocument, diffXmlPath);
System.out.println("比对完成,差异XML文件已生成。");
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Document parseXmlFile(String filePath) throws DocumentException {
File xmlFile = new File(filePath);
return DocumentHelper.parseText(xmlFile);
}
public static void compareElements(Element oldElement, Element newElement, Element diffElement) {
List<Element> oldChildren = oldElement.elements();
List<Element> newChildren = newElement.elements();
for (Element oldChild : oldChildren) {
String oldChildPath = oldChild.getPath();
String oldChildValue = oldChild.getText();
Element correspondingNewChild = findCorrespondingElement(oldChild, newChildren);
if (correspondingNewChild != null) {
String newChildValue = correspondingNewChild.getText();
if (!oldChildValue.equals(newChildValue)) {
Element modifyElement = diffElement.addElement(oldChildPath);
modifyElement.addAttribute("value", "modify");
modifyElement.setText(newChildValue);
}
newChildren.remove(correspondingNewChild);
} else {
Element deleteElement = diffElement.addElement(oldChildPath);
deleteElement.addAttribute("value", "del");
}
}
for (Element newChild : newChildren) {
String newChildPath = newChild.getPath();
String newChildValue = newChild.getText();
Element addElement = diffElement.addElement(newChildPath);
addElement.addAttribute("value", "add");
addElement.setText(newChildValue);
}
for (Element oldChild : oldChildren) {
compareElements(oldChild, newElement, diffElement);
}
}
public static Element findCorrespondingElement(Element element, List<Element> elements) {
for (Element e : elements) {
if (e.getName().equals(element.getName())) {
return e;
}
}
return null;
}
public static void saveXmlFile(Document document, String filePath) throws Exception {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(filePath), format);
writer.write(document);
writer.close();
}
}
```
这段代码使用了`dom4j`库来解析和操作XML文件。使用`parseXmlFile`方法解析Xml文件,`compareXml`方法比对两个Xml文件并生成新的差异Xml文件,`compareElements`方法递归比对元素,`findCorrespondingElement`方法查找对应的元素,`saveXmlFile`方法将生成的差异Xml文件保存到指定路径。
希望以上代码可以帮助到您!
### 回答3:
下面是一个简单的Java代码示例,用于比对两个XML格式文件并生成差异的XML格式文件:
```java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
public class XmlComparator {
public static void main(String[] args) {
String originalXml = "original.xml"; // 原始XML文件路径
String modifiedXml = "modified.xml"; // 修改后的XML文件路径
try {
List<String> diffXmlLines = compareXml(originalXml, modifiedXml);
saveDiffXml(diffXmlLines, "diff.xml"); // 保存生成的差异XML文件
} catch (IOException e) {
e.printStackTrace();
}
}
public static List<String> compareXml(String originalXml, String modifiedXml) throws IOException {
// 读取原始XML文件和修改后的XML文件
List<String> originalLines = FileUtils.readLines(new File(originalXml), "UTF-8");
List<String> modifiedLines = FileUtils.readLines(new File(modifiedXml), "UTF-8");
// 保存差异的XML行的列表
List<String> diffXmlLines = new ArrayList<>();
// 使用Map保存每个XML节点的内容
Map<String, String> originalNodes = new HashMap<>();
Map<String, String> modifiedNodes = new HashMap<>();
// 解析原始XML文件,保存每个节点的内容
for (String line : originalLines) {
if (line.contains("<value=")) {
String tagName = line.substring(line.indexOf("<") + 1, line.indexOf(">"));
String value = line.substring(line.indexOf("=") + 2, line.indexOf("' ", line.indexOf("=")));
originalNodes.put(tagName, value);
}
}
// 解析修改后的XML文件,保存每个节点的内容
for (String line : modifiedLines) {
if (line.contains("<value=")) {
String tagName = line.substring(line.indexOf("<") + 1, line.indexOf(">"));
String value = line.substring(line.indexOf("=") + 2, line.indexOf("' ", line.indexOf("=")));
modifiedNodes.put(tagName, value);
}
}
// 比较原始XML文件和修改后的XML文件,生成差异的XML行
for (String tagName : originalNodes.keySet()) {
if (modifiedNodes.containsKey(tagName)) { // 节点存在于修改后的XML中
if (!originalNodes.get(tagName).equals(modifiedNodes.get(tagName))) { // 值不同,表示修改
String diffLine = "<" + tagName + " value='modify'>";
diffXmlLines.add(diffLine);
}
} else { // 节点不存在于修改后的XML中,表示删除
String diffLine = "<" + tagName + " value='del'>";
diffXmlLines.add(diffLine);
}
}
// 检查在修改后的XML中新增的节点,并添加到差异XML中
for (String tagName : modifiedNodes.keySet()) {
if (!originalNodes.containsKey(tagName)) { // 新增的节点
String diffLine = "<" + tagName + " value='add'>";
diffXmlLines.add(diffLine);
}
}
return diffXmlLines;
}
public static void saveDiffXml(List<String> diffXmlLines, String fileName) throws IOException {
FileWriter writer = new FileWriter(fileName);
for (String line : diffXmlLines) {
writer.write(line + "\n");
}
writer.close();
}
}
```
以上代码利用XML内容的比较来生成差异的XML文件。它通过解析原始XML文件和修改后的XML文件,将两个文件中的节点内容保存在Map中进行比对,根据不同的情况生成差异的XML行并保存到差异XML文件中。对于原始XML中存在而修改后的XML中不存在的节点,将其标记为删除;对于修改了值的节点,将其标记为修改;对于修改后的XML中新增的节点,则将其标记为新增。
阅读全文