Migration Deep Dive für 30 · XML Parser öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 30 · 100 % Codeabdeckung

XML Parser

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.

4Legacy-Dateien
4Modern-Dateien
65 → 76Codezeilen
9/9vollständig erfasst

Fachliche Einordnung

Legacy

DOM Parser

Das gesamte XML-Dokument wird als Baum in den Speicher geladen.

Modern

StAX Streaming Parser

Der Parser liest Ereignisse vorwärts und hält nur den aktuellen Zustand.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration11343499%
XML-Testressource1111100%
Parser und Test22304142%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?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>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>30xmlparsers-pair</artifactId>
    <packaging>pom</packaging>
    <name>XML Parser: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 99%

Parser- und Testkonfiguration wird verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 99%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?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>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?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>
02XML-TestressourceDirektvergleich · Legacy 1 / Modern 1 Zeilen · Ähnlichkeit 100%

Identische Eingabe isoliert den Parserunterschied.

Legacy-DateienModern-DateienEinordnung
orders.xmlorders.xmlDirektvergleich
Semantische Ähnlichkeit: 100%

Legacy

Modern

03Parser und TestDirektvergleich · Legacy 30 / Modern 41 Zeilen · Ähnlichkeit 42%

DOM-Baumverarbeitung wird Streaming-Verarbeitung gegenübergestellt.

Legacy-DateienModern-DateienEinordnung
DomOrderReader.java
DomOrderReaderTest.java
StaxOrderReader.java
StaxOrderReaderTest.java
Direktvergleich
Semantische Ähnlichkeit: 42%

Legacy

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

Modern

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