DOM Parser
Das gesamte XML-Dokument wird als Baum in den Speicher geladen.
Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.
Das gesamte XML-Dokument wird als Baum in den Speicher geladen.
Der Parser liest Ereignisse vorwärts und hält nur den aktuellen Zustand.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 34 | 34 | 99% |
| XML-Testressource | 1 | 1 | 1 | 1 | 100% |
| Parser und Test | 2 | 2 | 30 | 41 | 42% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
Parser- und Testkonfiguration wird verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 99% |
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.aydin.academy</groupId>
<artifactId>30xmlparsers-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>xml-dom-legacy</artifactId>
<packaging>jar</packaging>
<name>XML DOM Legacy</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.aydin.academy</groupId>
<artifactId>30xmlparsers-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>xml-stax-modern</artifactId>
<packaging>jar</packaging>
<name>XML StAX Modern</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>Identische Eingabe isoliert den Parserunterschied.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| orders.xml | orders.xml | Direktvergleich Semantische Ähnlichkeit: 100% |
<orders><order id="1"><total>12.50</total></order><order id="2"><total>7.50</total></order></orders><orders><order id="1"><total>12.50</total></order><order id="2"><total>7.50</total></order></orders>DOM-Baumverarbeitung wird Streaming-Verarbeitung gegenübergestellt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| DomOrderReader.java DomOrderReaderTest.java | StaxOrderReader.java StaxOrderReaderTest.java | Direktvergleich Semantische Ähnlichkeit: 42% |
package at.aydin.lab.xmlparser.legacy;
import javax.xml.parsers.*;
import java.io.*;
// Design Pattern: Parser
// Zweck: DOM bietet komfortablen Objektbaum, lädt aber das komplette Dokument.
public final class DomOrderReader {
public double total(InputStream in) throws Exception {
var f = DocumentBuilderFactory.newInstance();
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
var nodes = f.newDocumentBuilder().parse(in).getElementsByTagName("total");
double sum = 0;
for (int i = 0; i < nodes.getLength(); i++) sum += Double.parseDouble(nodes.item(i).getTextContent());
return sum;
}
}package at.aydin.lab.xmlparser.legacy;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class DomOrderReaderTest {
@Test
void readsTree() throws Exception {
try (var in = getClass().getResourceAsStream("/orders.xml")) {
assertEquals(20, new DomOrderReader().total(in));
}
}
}package at.aydin.lab.xmlparser.modern;
import java.io.InputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
// Design Pattern: Iterator
// Zweck: Pull-Parsing verarbeitet große Dokumente ereignisweise mit konstantem Speicherbedarf.
public final class StaxOrderReader {
public double total(InputStream inputStream) throws Exception {
XMLInputFactory factory = XMLInputFactory.newFactory();
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
double sum = 0;
while (reader.hasNext()) {
boolean totalElement = reader.next() == XMLStreamConstants.START_ELEMENT
&& reader.getLocalName().equals("total");
if (totalElement) {
sum += Double.parseDouble(reader.getElementText());
}
}
reader.close();
return sum;
}
}package at.aydin.lab.xmlparser.modern;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class StaxOrderReaderTest {
@Test
void streamsEvents() throws Exception {
try (var in = getClass().getResourceAsStream("/orders.xml")) {
assertEquals(20, new StaxOrderReader().total(in));
}
}
}