[英]How to output the difference between two xml files into another xml file
我需要比較兩個 XML 文件並在另一個 xml 文件中打印結果此代碼在控制台中正確比較和打印差異,但它只在 XML 文件中打印一行。此外,當我在控制台中查看輸出時,似乎它正在創建 n 個與 totaldifferences 相等的 xml 文件。 任何幫助表示贊賞。提前致謝。
public class CreateXMLFileJava {
public static final String xmlFilePath = "C:\\test\\xmlfile.xml";
public static void main(String argv[]) throws SAXException, IOException, ParserConfigurationException, TransformerException
{
FileInputStream fis1 = new FileInputStream("c:\\test\\source.xml");
FileInputStream fis2 = new FileInputStream("c:\\test\\target.xml");
BufferedReader source = new BufferedReader(new InputStreamReader(fis1));
BufferedReader target = new BufferedReader(new InputStreamReader(fis2));
XMLUnit.setIgnoreWhitespace(true);
List<String> differences = compareXML(source, target);
try {
printDifferences(differences);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
public static void buildxml(String st, int totalDifferences)
{
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element root = document.createElement("Errorlist");
document.appendChild(root);
Element number = document.createElement("error");
root.appendChild(number);
Attr attr = document.createAttribute("i");
attr.setValue(st);
number.setAttributeNode(attr);
// create the xml file
//transform the DOM Object to an XML File
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File(xmlFilePath));
transformer.transform(domSource, streamResult);
System.out.println("Done creating XML File");
}
public static List<String> compareXML(Reader source, Reader target) throws
SAXException, IOException
{
Diff xmlDiff = new Diff(source, target);
DetailedDiff detailXmlDiff = new DetailedDiff(xmlDiff);
return detailXmlDiff.getAllDifferences();
}
public static void printDifferences(List<String> differences) throws IOException, ParserConfigurationException, TransformerException
{
int totalDifferences = differences.size();
System.out.println("===============================");
System.out.println("Total differences : " + totalDifferences);
System.out.println("================================");
for (Iterator<String> iterator = differences.iterator(); iterator.hasNext();) {
Object s=(Object)iterator.next();
String st=s.toString();
System.out.println(st);
buildxml(st,totalDifferences);
}
根據您的代碼,方法buildxml
在您的差異列表的每次迭代中創建新文件。 但是您需要創建 DOMmodel,在每次迭代中添加新元素( appendChild
),然后才創建文件。
你可以這樣修復它。 刪除方法printDifferences
並將邏輯轉移到buildXml
public class CreateXMLFileJava {
public static final String xmlFilePath = "C:\\test\\xmlfile.xml";
public static void main(String argv[]) throws SAXException, IOException, ParserConfigurationException, TransformerException
{
FileInputStream fis1 = new FileInputStream("c:\\test\\source.xml");
FileInputStream fis2 = new FileInputStream("c:\\test\\target.xml");
BufferedReader source = new BufferedReader(new InputStreamReader(fis1));
BufferedReader target = new BufferedReader(new InputStreamReader(fis2));
XMLUnit.setIgnoreWhitespace(true);
List<String> differences = compareXML(source, target);
try {
printDifferences(differences);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
public static void buildxml(String st, List<String> differences)
{
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element root = document.createElement("Errorlist");
document.appendChild(root);
int totalDifferences = differences.size();
System.out.println("===============================");
System.out.println("Total differences : " + totalDifferences);
System.out.println("================================");
for (Iterator<String> iterator = differences.iterator(); iterator.hasNext();) {
Object s=(Object)iterator.next();
String st=s.toString();
System.out.println(st);
Element number = document.createElement("error");
Attr attr = document.createAttribute("i");
attr.setValue(st);
number.setAttributeNode(attr);
root.appendChild(number);
}
// create the xml file
//transform the DOM Object to an XML File
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File(xmlFilePath));
transformer.transform(domSource, streamResult);
System.out.println("Done creating XML File");
}
public static List<String> compareXML(Reader source, Reader target) throws
SAXException, IOException
{
Diff xmlDiff = new Diff(source, target);
DetailedDiff detailXmlDiff = new DetailedDiff(xmlDiff);
return detailXmlDiff.getAllDifferences();
}
我對代碼進行了一些更改以顯示輸出消息和 xml
public static void printDifferences(List<String> differences) throws IOException, ParserConfigurationException, TransformerException
{
int totalDifferences = differences.size();
System.out.println("===============================");
System.out.println("Total differences : " + totalDifferences);
System.out.println("================================");
int count = 0;
List<Object> l2=new ArrayList<>();
for (Iterator<String> iterator = differences.iterator(); iterator.hasNext();) {
Object s=(Object)iterator.next();
l2.add(s);
count++;
buildxml(l2,count);
}
System.out.println("Done creating XML File");
}
public static void buildxml(List l, int count)
throws ParserConfigurationException, TransformerException {
int i=0;
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element root = document.createElement("Errorlist");
document.appendChild(root);
for(Object ob:l) {
Element error = document.createElement("error");
root.appendChild(error);
error.setAttribute("id", String.valueOf(++i));
Element number=document.createElement("ERR");
number.appendChild(document.createTextNode(ob.toString()));
error.appendChild(number);
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File(xmlFilePath));
//StreamResult streamResult = new StreamResult(System.out);
transformer.transform(domSource, streamResult);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.