1

I need to compare two xml files and merge into one. If element or attribute is different i want to decide if i want to add or remove this data. I use StaX to read and write document. Now i just need to add element from secound xml file, but i have problem with cursor position when i compare data between xml files. I will be very greatful if You know solution of this problem.

   XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

    XMLInputFactory factory = XMLInputFactory.newInstance();
    XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(new FileOutputStream(out), "UTF-8");


    XMLStreamReader streamReaderTest = factory.createXMLStreamReader(new FileReader(fileTest));

    XMLStreamReader streamReaderControl = factory.createXMLStreamReader(new FileReader(fileControl));

    streamWriter.writeStartDocument("UTF-8", "1.0");

    //Move to next event
    streamReaderTest.next();
    streamReaderControl.next();

    int eventType = streamReaderControl.getEventType();

    while (streamReaderTest.hasNext() && streamReaderControl.hasNext()) {

        switch (eventType) {
            //Check if its 'START_ELEMENT'
            case (XMLStreamReader.START_ELEMENT):

                if(streamReaderControl.isStartElement()) {


                    if (streamReaderControl.getLocalName().equalsIgnoreCase(streamReaderTest.getLocalName())) {
                        streamWriter.writeStartElement(streamReaderControl.getLocalName());

                        //Read attributes within tag
                        if (streamReaderControl.getAttributeCount() > 0) {
                            for (int i = 0; i < streamReaderControl.getAttributeCount(); i++) {
                                streamWriter.writeAttribute(streamReaderControl.getAttributeLocalName(i), streamReaderControl.getAttributeValue(i));
                            }
                        }
                        streamReaderTest.next();
                        streamReaderControl.next();
                        eventType = streamReaderControl.getEventType();
                    }
                }

                if (streamReaderControl.isStartElement()) {

                    if (!streamReaderControl.getLocalName().equalsIgnoreCase(streamReaderTest.getLocalName())) {
                        System.out.println("find difference in node \n Location: " + streamReaderControl.getLocation());
                        streamWriter.writeStartElement(streamReaderTest.getLocalName());

                        if (streamReaderTest.getAttributeCount() > 0) {
                            for (int i = 0; i < streamReaderTest.getAttributeCount(); i++) {
                                streamWriter.writeAttribute(streamReaderTest.getAttributeLocalName(i), streamReaderTest.getAttributeValue(i));
                            }
                        }
                    }
                    streamReaderTest.next();
                    eventType = streamReaderTest.getEventType();
                }

                break;

            case (XMLStreamReader.END_ELEMENT):
                if (streamReaderTest.isEndElement()) {
                    streamWriter.writeEndElement();
                    streamReaderTest.next();
                    eventType = streamReaderTest.getEventType();
                    streamReaderControl.next();
                } else if(streamReaderControl.isEndElement()){
                    streamWriter.writeEndElement();
                    streamReaderControl.next();
                    eventType = streamReaderControl.getEventType();
                    streamReaderTest.next();
                }
                break;

            case (XMLStreamReader.CDATA):
            case (XMLStreamReader.CHARACTERS):
                if (eventType == streamReaderTest.getEventType()) {
                    streamWriter.writeCharacters(streamReaderTest.getText());
                    streamReaderTest.next();
                    streamReaderControl.next();
                    eventType = streamReaderTest.getEventType();
                } else {
                    streamWriter.writeCharacters(streamReaderControl.getText());
                    streamReaderTest.next();
                    streamReaderControl.next();
                    eventType = streamReaderControl.getEventType();
                }
                break;
        }

    }

For Example First Control XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Entities build="a100" majorVersion="1" minorVersion="3"
          modelPersistenceProviderPackage="H2PersistenceProviderPackage"
          revision="0" schemaVersion="1040" universal="">
    <Things>
        <Thing aspect.isSystemObject="false" description="" 
 documentationContent="">
            <Owner name="Administrator" type="User"/>
            <avatar/>
            <DesignTimePermissions>
                <Create/>
                <Read/>
                <Update/>
                <Delete/>
                <Metadata/>
            </DesignTimePermissions>
            <RunTimePermissions/>
            <VisibilityPermissions>
                <Visibility/>
            </VisibilityPermissions>
        </Thing>
    </Things>
</Entities>

Second one TEST

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Entities build="238" majorVersion="8" minorVersion="1"
          modelPersistenceProviderPackage="CHANGE_VALUE_LIKE_THIS"
          revision="0" schemaVersion="1040" universal="">
    <Things>
        <Thing aspect.isSystemObject="true" description="NahNahNah" 
        documentationContent="">
            <Owner name="Administrator" type="User"/>
            <Owners name="User" type="ADD NEW ELEMENTS OR REMOVE LIKE THIS 
            ONE BELOW"/>
            <avatars/>
            <DesignTimePermissions>
                <Create/>
                <Metadata/>
            </DesignTimePermissions>
        </Thing>
    </Things>
</Entities>

RESULT

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Entities build="238" majorVersion="8" minorVersion="1"
          modelPersistenceProviderPackage="CHANGE_VALUE_LIKE_THIS"
          revision="0" schemaVersion="1040" universal="">
    <Things>
        <Thing aspect.isSystemObject="true" description="NahNahNah" 
        documentationContent="">
            <Owner name="Administrator" type="User"/>
            <Owners name="User" type="ADD NEW ELEMENTS OR REMOVE LIKE THIS 
             ONE BELOW"/>
            <avatars/>
            <DesignTimePermissions>
                <Create/>
                <Update/>
                <Delete/>
                <Metadata/>
            </DesignTimePermissions>
            <RunTimePermissions/>
        </Thing>
    </Things>
</Entities>
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
kali82
  • 11
  • 1
  • 2
  • Possible duplicate of [How to Merge two XMLs in Java](https://stackoverflow.com/questions/5681597/how-to-merge-two-xmls-in-java) – Gewure Aug 01 '19 at 17:50
  • This solution just add each element into one file, first one and then another one. I need to compare two very similar XML files and change value of the same element or add new element in the same location. I also found differences using xmlUnit, but i think its useless if I use StaX API – kali82 Aug 01 '19 at 18:15

0 Answers0