Как вывести разницу между двумя xml файлами в другой xml файл - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно сравнить два XML файла и распечатать результаты в других xml файлах. Этот код правильно сравнивает и печатает различия в консоли, но печатает только одну строку в файле XML. Более того, когда я просмотреть вывод в консоли, кажется, он создает n файлов xml, равных totaldifferences. Любая помощь приветствуется. Спасибо заранее.

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);
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Я сделал несколько изменений в своем коде для отображения выходного сообщения вместе с 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);

    }

}
0 голосов
/ 11 февраля 2020

Согласно вашему коду, метод buildxml создает новый файл каждую итерацию по списку различий. Но вам нужно создать DOMmodel, в каждой итерации добавлять новый элемент (appendChild) и только потом создавать файл.

Вы можете исправить это следующим образом. Удалить метод printDifferences и перенести логи c в 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...