using System.Data; using GB5Shared.DTO.Ice; using IceImportDAL.DTO.IceImportPipeline; namespace IceImportDAL.CustomCode.Parsers; // IceMapIceSourceType = 2 (Xml). Matches legacy's actual approach — DataSet.ReadXml, one // DataTable per distinct node name (legacy used DataSet.Tables[NodeName]). Every column comes // back typed by DataSet.ReadXml's own inference; downstream field resolvers coerce as needed // (same as Excel/CSV, whose columns are already all-string). public class XmlSourceFileParser : ISourceFileParser { public int SourceType => 2; public async Task ParseAsync( Stream fileStream, string fileName, IceMapDTO mapDefinition, CancellationToken ct) { ct.ThrowIfCancellationRequested(); using var ms = new MemoryStream(); await fileStream.CopyToAsync(ms, ct).ConfigureAwait(false); ms.Position = 0; var ds = new DataSet(); ds.ReadXml(ms); var result = new ParsedImportDataSetDTO { SourceFileName = fileName }; foreach (DataTable table in ds.Tables) result.Tables[table.TableName] = table; return result; } }