Att konvertera GML (Geography Markup Language)-filer verkar enkelt tills läsaren inte kan hitta XML‑schemat. En GML‑fil beskriver sina objekttyper och attribut i ett separat XSD som refereras via attributet schemaLocation. När det schemat har gått förlorat, flyttats eller inte kan hämtas, försvinner även attributdefinitionerna, och ett konverteringsjobb som fungerade på din maskin börjar misslyckas på en byggserver. Denna guide visar hur du bevarar GML‑schemainformation under konvertering i C# med Aspose.GIS for .NET, och hur du bevisar att funktioner och attribut överlevde rundresan.

Varför bevarande av GML-schemat är viktigt

GML är ett populärt utbytesformat eftersom det bär med sig både geometri‑ och attributdata. Strukturen för dessa data, det vill säga objekttyper, attributnamn och datatyper, definieras av ett applikationsschema. Aspose.GIS läser detta schema för att bygga lagrets attributsamling, så schemat är det som omvandlar rå XML till användbara kolumner i din kod, i QGIS eller i ArcGIS.

I riktiga pipelines är schemat ofta den svagaste länken. Filer kopieras utan sin XSD, schemaLocation pekar på en föråldrad URL, eller så har servern som kör konverteringen ingen internetåtkomst. I dessa fall stoppar Aspose.GIS med ett GisException som förklarar att det misslyckades med att bygga samlingen av funktionsegenskaper. GmlOptions.RestoreSchema‑alternativet löser detta genom att låta läsaren återskapa attributschemat från själva funktionsdata, så att dina konverteringar behåller sina attribut istället för att misslyckas eller producera ofullständig output.

Komma igång med Aspose.GIS för .NET

Aspose.GIS for .NET är ett hanterat bibliotek för att läsa, skriva och konvertera GIS-format såsom GML, Shapefile, GeoJSON, KML och File Geodatabase, utan att kräva ArcGIS eller QGIS på maskinen. Lägg till det i ditt projekt från NuGet:

Install-Package Aspose.GIS

Eller med .NET CLI:

dotnet add package Aspose.GIS

Du kan läsa mer på produktsidan för Aspose.GIS for .NET och i Aspose.GIS .NET API Reference. De två namnrymderna som används i den här handledningen är Aspose.Gis, som innehåller VectorLayer, Drivers och ConversionOptions, samt Aspose.Gis.Formats.Gml, som innehåller GmlOptions.

Steg-för-steg handledning för att bevara GML-schema

Följande C#-exempel konverterar en GML-fil till en ny GML-fil samtidigt som attributschemat återställs, och verifierar sedan resultatet. Det riktar sig mot .NET 6 eller senare.

Vad exemplet gör

  1. Skapar läsaralternativ med GmlOptions.RestoreSchema satt till true.
  2. Öppnar käll‑GML och registrerar dess funktionsantal och attributnamn.
  3. Konverterar filen med VectorLayer.Convert, och skickar läsaralternativen via ConversionOptions.SourceDriverOptions.
  4. Öppnar om utdata med schemaåterställning och jämför den mot källan.
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 };
}

Förklaring av varje steg

  • Skapa läsaralternativ – GmlOptions innehåller GML-specifika drivrutinsinställningar. Enligt referensen GmlOptions.RestoreSchema innebär att sätta den till true att läsaren inte längre kräver ett XML-schema. Drivrutinen skannar filen efter kända GML-strukturer och härleder feature-klasserna och deras egenskaper. Standardvärdet är false.
  • Fånga källstrukturen – Att öppna källan med VectorLayer.Open ger dig en grundlinje. layer.Count returnerar antalet features, och layer.Attributes exponerar attributsamlingen, där varje FeatureAttribute har ett Name och en DataType.
  • Anropa VectorLayer.Convert – Överlagringen som används här accepterar källsökvägen, källdrivrutin, målsökvägen, måldrivrutin och ett ConversionOptions-objekt. SourceDriverOptions styr hur indata läses, medan DestinationDriverOptions styr hur utdata skrivs. Eftersom RestoreSchema påverkar läsning, placeras den på källsidan.
  • Verifiera utdata – Utdata öppnas igen med samma läsaralternativ så att verifieringen inte beror på att ett XSD finns. Istället för hårdkodade tal jämför provet utdata med källan. Det misslyckas när features eller attribut går förlorade och skriver ut de återställda attributnamnen och datatyperna för granskning. Extra attribut behandlas inte som fel, eftersom identifierare såsom gml_id kan exponeras annorlunda efter konvertering.

Läsa GML när den ursprungliga XSD-filen är tillgänglig

Schemaåterställning är en reservlösning. Om du fortfarande har den ursprungliga schemafilen, peka läsaren till den med SchemaLocation så att attributdefinitionerna hämtas från XSD snarare än att härledas:

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

När SchemaLocation är null (standardvärdet) läser Aspose.GIS schemaLocation från rotnoden i GML-dokumentet. LoadSchemasFromInternet är false som standard, så scheman som refereras av absoluta icke-file://‑URI:er hämtas inte om du inte aktiverar det.

Få en gratis licens

Aspose.GIS körs i utvärderingsläge med begränsningar tills en licens har tillämpats. För att testa hela funktionsuppsättningen, begär en Gratis tillfällig licens och tillämpa den innan din första GIS‑operation:

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

Gratis ytterligare resurser

Slutsats

Att bevara GML‑schemasinformation under konvertering handlar om att kontrollera hur källan läses. Med GmlOptions.RestoreSchema som skickas via ConversionOptions.SourceDriverOptions kan Aspose.GIS for .NET återuppbygga attributdefinitioner även när XSD saknas eller är oåtkomlig, så konverteringar behåller sina data istället för att misslyckas. Att kombinera det alternativet med en jämförelse mellan källa och output ger dig bevis på att funktioner och attribut har gått igenom, och att byta till SchemaLocation när det ursprungliga schemat är tillgängligt ger det mest trogna resultatet. Tillsammans gör dessa metoder GML‑konvertering pålitlig i batchjobb, webbtjänster och CI‑pipelines.

FAQs

1. Vad gör GmlOptions.RestoreSchema egentligen?
Den låter Aspose.GIS GML‑läsaren tolka funktionsattribut när XML‑schemat (XSD) som refereras av filen saknas eller inte kan laddas. Drivrutinen skannar dokumentet efter kända GML‑strukturer och härleder funktionsklasserna och deras egenskaper från data. Standardvärdet är false.

2. Måste jag ställa in RestoreSchema för både konverteringen och utdatafilen? Endast för filer vars schema inte kan laddas. RestoreSchema är ett läsalternativ, så under konverteringen hör det till ConversionOptions.SourceDriverOptions, och när du öppnar om utdata igen skickar du det till VectorLayer.Open. Exemplet sätter det på båda ställena så arbetsflödet inte är beroende av att en XSD finns tillgänglig.

3. Vad händer om RestoreSchema är falskt och schemat saknas? Aspose.GIS kan inte bygga samlingen av attribut för funktioner och kastar ett GisException. Undantagsmeddelandet föreslår att sätta RestoreSchema till true, eller LoadSchemasFromInternet till true när schemat är värd online.

4. Är ett återställt schema identiskt med det ursprungliga XSD?
Inte nödvändigtvis. Aspose.GIS beskriver schemarestauration som felbenägen eftersom attribut härleds genom att skanna filen. Verifiera resultatet, som exemplet gör, och använd GmlOptions.SchemaLocation när du har det ursprungliga XSD.

5. Kan jag använda RestoreSchema när jag konverterar GML till Shapefile, GeoJSON eller andra format?
Ja. SourceDriverOptions styr hur GML‑källan läses oavsett destinationens drivrutin. De återställda attributen skrivs sedan med formatets egna attributmodell.

6. Behöver jag en licens för att köra den här koden? Nej. Utan en licens kör Aspose.GIS i evalueringsläge med begränsningar. En gratis tillfällig licens tar bort dessa begränsningar för testning, och produktionsanvändning kräver en köpt licens.

Läs mer