1

我需要比较两个 xml 文件并合并为一个。如果元素或属性不同,我想决定是否要添加或删除此数据。我使用 StaX 来读写文档。现在我只需要从第二个 xml 文件中添加元素,但是当我比较 xml 文件之间的数据时,光标位置有问题。如果您知道这个问题的解决方案,我将非常感激。

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

    }

例如第一个控件 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>

第二个测试

<?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>

结果

<?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>
4

0 回答 0