Die Konvertierung von GML (Geography Markup Language)-Dateien sieht einfach aus, bis der Reader das XML‑Schema nicht finden kann. Eine GML‑Datei beschreibt ihre Feature‑Typen und Attribute in einem separaten XSD, das über das Attribut schemaLocation referenziert wird. Wenn dieses Schema verloren geht, verschoben wird oder nicht heruntergeladen werden kann, gehen die Attributdefinitionen mit verloren, und ein Konvertierungsjob, der auf Ihrem Rechner funktioniert hat, schlägt auf einem Build‑Server fehl. Dieser Leitfaden zeigt, wie man GML‑Schemainformationen während der Konvertierung in C# mit Aspose.GIS for .NET beibehält und wie man nachweisen kann, dass Features und Attribute die Rundreise überlebt haben.

Warum das Bewahren des GML-Schemas wichtig ist

GML ist ein beliebtes Austauschformat, weil es Geometrie‑ und Attributdaten zusammenführt. Die Struktur dieser Daten, also die Feature‑Typen, Attributnamen und Datentypen, wird durch ein Anwendungsschema definiert. Aspose.GIS liest dieses Schema, um die Attributsammlung einer Ebene zu erstellen, sodass das Schema Roh‑XML in nutzbare Spalten in Ihrem Code, in QGIS oder in ArcGIS umwandelt.

In realen Pipelines ist das Schema oft das schwächste Glied. Dateien werden ohne ihr XSD kopiert, schemaLocation verweist auf eine veraltete URL, oder der Server, auf dem die Konvertierung läuft, hat keinen Internetzugang. In diesen Fällen stoppt Aspose.GIS mit einer GisException, die erklärt, dass das Erstellen der Feature‑Attributsammlung fehlgeschlagen ist. Die Option GmlOptions.RestoreSchema löst dies, indem sie dem Reader ermöglicht, das Attributschema aus den Feature‑Daten selbst zu rekonstruieren, sodass Ihre Konvertierungen ihre Attribute behalten, anstatt zu fehlschlagen oder unvollständige Ausgaben zu erzeugen.

Erste Schritte mit Aspose.GIS für .NET

Aspose.GIS for .NET ist eine verwaltete Bibliothek zum Lesen, Schreiben und Konvertieren von GIS‑Formaten wie GML, Shapefile, GeoJSON, KML und File Geodatabase, ohne dass ArcGIS oder QGIS auf dem Rechner installiert sein muss. Fügen Sie es Ihrem Projekt über NuGet hinzu:

Install-Package Aspose.GIS

Oder mit der .NET CLI:

dotnet add package Aspose.GIS

Weitere Informationen finden Sie auf der Produktseite von Aspose.GIS for .NET und in der Aspose.GIS .NET API Reference. Die beiden Namespaces, die in diesem Tutorial verwendet werden, sind Aspose.Gis, der VectorLayer, Drivers und ConversionOptions enthält, und Aspose.Gis.Formats.Gml, der GmlOptions enthält.

Schritt-für-Schritt-Anleitung zum Erhalt des GML-Schemas

Das folgende C#‑Beispiel konvertiert eine GML‑Datei in eine neue GML‑Datei, wobei das Attributschema wiederhergestellt wird, und überprüft anschließend das Ergebnis. Es richtet sich an .NET 6 oder höher.

Was das Beispiel tut

  1. Erstellt Leseoptionen mit GmlOptions.RestoreSchema, das auf true gesetzt ist.
  2. Öffnet das Quell‑GML und erfasst dessen Feature‑Anzahl und Attributnamen.
  3. Konvertiert die Datei mit VectorLayer.Convert und übergibt die Leseoptionen über ConversionOptions.SourceDriverOptions.
  4. Öffnet die Ausgabe erneut mit Schema‑Wiederherstellung und vergleicht sie mit der Quelle.
using System;
using System.IO;
using System.Linq;
using Aspose.Gis;
using Aspose.Gis.Formats.Gml;

class PreserveGmlSchema
{
    static void Main()
    {
        // Input and output paths. Adjust them to your environment.
        string sourcePath = Path.Combine("data", "input.gml");
        string destinationPath = Path.Combine("data", "output.gml");

// Step 1: Capture the structure of the source layer.
        // RestoreSchema lets the reader infer attributes when the XSD is missing or unreachable.
        int sourceFeatureCount;
        string[] sourceAttributeNames;

using (VectorLayer source = VectorLayer.Open(sourcePath, Drivers.Gml, CreateReadOptions()))
        {
            sourceFeatureCount = source.Count;
            sourceAttributeNames = source.Attributes.Select(a => a.Name).ToArray();
        }

// Step 2: Convert GML to GML. RestoreSchema is a reader option,
        // so it is supplied through SourceDriverOptions.
        var conversionOptions = new ConversionOptions
        {
            SourceDriverOptions = CreateReadOptions()
        };

VectorLayer.Convert(sourcePath, Drivers.Gml, destinationPath, Drivers.Gml, conversionOptions);

// Step 3: Reopen the output and compare it with the source.
        using (VectorLayer output = VectorLayer.Open(destinationPath, Drivers.Gml, CreateReadOptions()))
        {
            if (output.Count != sourceFeatureCount)
            {
                throw new InvalidOperationException(
                    $"Feature count mismatch: source has {sourceFeatureCount}, output has {output.Count}.");
            }

string[] outputAttributeNames = output.Attributes.Select(a => a.Name).ToArray();
            string[] missingAttributes = sourceAttributeNames.Except(outputAttributeNames).ToArray();

if (missingAttributes.Length > 0)
            {
                throw new InvalidOperationException(
                    $"Attributes missing from output: {string.Join(", ", missingAttributes)}");
            }

Console.WriteLine($"Converted {output.Count} features with {output.Attributes.Count} attributes:");

foreach (FeatureAttribute attribute in output.Attributes)
            {
                Console.WriteLine($"  {attribute.Name} ({attribute.DataType})");
            }
        }
    }

// A fresh options instance for each read keeps the configuration explicit.
    static GmlOptions CreateReadOptions() => new GmlOptions { RestoreSchema = true };
}

Erklärung jedes Schrittes

  • Erstellen von Reader-Optionen – GmlOptions enthält GML-spezifische Treibereinstellungen. Laut der GmlOptions.RestoreSchema Referenz bedeutet das Setzen auf true, dass der Reader kein XML‑Schema mehr benötigt. Der Treiber durchsucht die Datei nach bekannten GML‑Strukturen und leitet die Feature‑Klassen und deren Eigenschaften ab. Der Standardwert ist false.

  • Erfassen der Quellstruktur – Das Öffnen der Quelle mit VectorLayer.Open liefert eine Basis. layer.Count gibt die Anzahl der Features zurück, und layer.Attributes stellt die Attributsammlung bereit, wobei jedes FeatureAttribute einen Name und einen DataType hat.

  • Aufrufen von VectorLayer.Convert – Die hier verwendete Überladung akzeptiert den Quellpfad, den Quell‑Treiber, den Zielpfad, den Ziel‑Treiber und ein ConversionOptions‑Objekt. SourceDriverOptions steuert, wie die Eingabe gelesen wird, während DestinationDriverOptions bestimmt, wie die Ausgabe geschrieben wird. Da RestoreSchema das Lesen beeinflusst, wird es auf der Quellseite angegeben.

  • Verifizieren der Ausgabe – Die Ausgabe wird mit derselben Reader‑Option erneut geöffnet, sodass die Überprüfung nicht von einem vorhandenen XSD abhängt. Anstatt fest codierter Zahlen vergleicht das Beispiel die Ausgabe mit der Quelle. Es schlägt fehl, wenn Features oder Attribute verloren gehen, und gibt die wiederhergestellten Attributnamen und Datentypen zur Überprüfung aus. Zusätzliche Attribute werden nicht als Fehler behandelt, da Bezeichner wie gml_id nach der Konvertierung möglicherweise anders dargestellt werden.

Lesen von GML, wenn das ursprüngliche XSD verfügbar ist

Die Wiederherstellung des Schemas ist ein Rückfall. Wenn Sie noch die ursprüngliche Schemadatei haben, verweisen Sie den Leser mit SchemaLocation darauf, sodass Attributdefinitionen aus dem XSD stammen und nicht abgeleitet werden:

using System;
using Aspose.Gis;
using Aspose.Gis.Formats.Gml;

var options = new GmlOptions
{
    // Space-separated pair: namespace URI, then the path to its XML schema.
    SchemaLocation = "http://www.example.com/myfeatures schema.xsd",
    LoadSchemasFromInternet = false
};

using (VectorLayer layer = VectorLayer.Open("input.gml", Drivers.Gml, options))
{
    Console.WriteLine($"Features: {layer.Count}, attributes: {layer.Attributes.Count}");
}

Wenn SchemaLocation null ist (der Standard), liest Aspose.GIS schemaLocation aus dem Wurzelelement des GML‑Dokuments. LoadSchemasFromInternet ist standardmäßig false, sodass Schemas, die durch absolute nicht-file://‑URIs referenziert werden, nicht heruntergeladen werden, es sei denn, Sie aktivieren es.

Kostenlose Lizenz erhalten

Aspose.GIS läuft im Evaluierungsmodus mit Einschränkungen, bis eine Lizenz angewendet wird. Um das vollständige Funktionsspektrum zu testen, fordern Sie eine Kostenlose temporäre Lizenz an und wenden Sie sie vor Ihrer ersten GIS-Operation an:

var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");

Kostenlose zusätzliche Ressourcen

Fazit

Das Beibehalten von GML‑Schemainformationen während der Konvertierung hängt davon ab, wie die Quelle gelesen wird. Mit GmlOptions.RestoreSchema, das über ConversionOptions.SourceDriverOptions übergeben wird, kann Aspose.GIS for .NET Attributdefinitionen wiederherstellen, selbst wenn das XSD fehlt oder nicht erreichbar ist, sodass Konvertierungen ihre Daten behalten statt zu fehlschlagen. Die Kombination dieser Option mit einem Vergleich von Quelle zu Ausgabe liefert den Nachweis, dass Features und Attribute durchgekommen sind, und das Umschalten auf SchemaLocation, wenn das ursprüngliche Schema verfügbar ist, liefert das treuestm Ergebnis. Zusammen machen diese Praktiken die GML‑Konvertierung in Batch‑Jobs, Webdiensten und CI‑Pipelines zuverlässig.

FAQs

1. Was macht GmlOptions.RestoreSchema eigentlich?
Es ermöglicht dem Aspose.GIS GML-Reader, Feature‑Attribute zu analysieren, wenn das von der Datei referenzierte XML‑Schema (XSD) fehlt oder nicht geladen werden kann. Der Treiber durchsucht das Dokument nach bekannten GML‑Strukturen und leitet die Feature‑Klassen sowie deren Eigenschaften aus den Daten ab. Der Standardwert ist false.

2. Muss ich RestoreSchema sowohl für die Konvertierung als auch für die Ausgabedatei setzen?
Nur für Dateien, deren Schema nicht geladen werden kann. RestoreSchema ist eine Leseoption, daher gehört es während der Konvertierung zu ConversionOptions.SourceDriverOptions, und wenn Sie die Ausgabe erneut öffnen, übergeben Sie es an VectorLayer.Open. Das Beispiel setzt es an beiden Stellen, sodass der Workflow nicht von einem verfügbaren XSD abhängt.

3. Was passiert, wenn RestoreSchema false ist und das Schema fehlt? Aspose.GIS kann die Feature‑Attributsammlung nicht erstellen und wirft eine GisException. Die Fehlermeldung schlägt vor, RestoreSchema auf true zu setzen oder LoadSchemasFromInternet auf true, wenn das Schema online gehostet wird.

4. Ist ein wiederhergestelltes Schema identisch mit dem ursprünglichen XSD?
Nicht unbedingt. Aspose.GIS beschreibt die Schema‑Wiederherstellung als fehleranfällig, weil Attribute durch Scannen der Datei abgeleitet werden. Überprüfen Sie das Ergebnis, wie das Beispiel zeigt, und verwenden Sie GmlOptions.SchemaLocation, wenn Sie das ursprüngliche XSD haben.

5. Kann ich RestoreSchema beim Konvertieren von GML zu Shapefile, GeoJSON oder anderen Formaten verwenden?
Ja. SourceDriverOptions steuert, wie die GML‑Quelle gelesen wird, unabhängig vom Ziel‑Treiber. Die wiederhergestellten Attribute werden dann mit dem eigenen Attributmodell des Zielformats geschrieben.

6. Benötige ich eine Lizenz, um diesen Code auszuführen?
Nein. Ohne Lizenz läuft Aspose.GIS im Evaluierungsmodus mit Einschränkungen. Eine kostenlose temporäre Lizenz entfernt diese Einschränkungen für Tests, und die Produktion erfordert eine gekaufte Lizenz.

Mehr lesen