我需要比较两个 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>