mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 17:25:32 +00:00
106 lines
3.7 KiB
C#
106 lines
3.7 KiB
C#
namespace HaWeb.XMLParser;
|
|
using System.Xml.Linq;
|
|
using System.Text.Json.Serialization;
|
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
|
|
|
public class XMLRootDocument {
|
|
private XElement? _Element;
|
|
private string? _filename;
|
|
private string? _path;
|
|
private IXMLService _xmlService;
|
|
|
|
[JsonIgnore]
|
|
public XElement Root {
|
|
get {
|
|
if (_Element == null) {
|
|
_Element = GetElement();
|
|
}
|
|
return _Element;
|
|
} }
|
|
|
|
public string FileName { get {
|
|
if (_filename == null)
|
|
_filename = _CreateFilename();
|
|
return _filename;
|
|
} }
|
|
|
|
public string Prefix { get; private set; }
|
|
public DateTime Date { get; private set; }
|
|
|
|
public (string?, string?) IdentificationString { get; private set; }
|
|
[JsonIgnore]
|
|
public List<(string, string)>? Fields { get; set; }
|
|
|
|
// Entry point for file reading
|
|
public XMLRootDocument(IXMLService xmlService, string prefix, (string?, string?) idString, DateTime date, string path) {
|
|
_xmlService = xmlService;
|
|
_path = path;
|
|
Prefix = prefix;
|
|
IdentificationString = idString;
|
|
Date = date;
|
|
}
|
|
|
|
// Entry point for XML upload reading
|
|
public XMLRootDocument(IXMLService xmlService, string prefix, (string?, string?) idString, XElement element) {
|
|
_xmlService = xmlService;
|
|
Prefix = prefix;
|
|
IdentificationString = idString;
|
|
Date = DateTime.Today;
|
|
_Element = element;
|
|
}
|
|
|
|
private string _CreateFilename() {
|
|
var filename = _removeInvalidChars(Prefix) + "_";
|
|
if (!String.IsNullOrWhiteSpace(IdentificationString.Item1)) {
|
|
var hash = IdentificationString.Item1.GetHashCode().ToString("X8");
|
|
filename += hash + "_";
|
|
}
|
|
if (!String.IsNullOrWhiteSpace(IdentificationString.Item2)) filename += _removeInvalidChars(IdentificationString.Item2) + "_";
|
|
filename += _removeInvalidChars(Date.Year.ToString() + "-" + Date.Month.ToString() + "-" + Date.Day.ToString());
|
|
return filename + ".xml";
|
|
}
|
|
|
|
private string _removeInvalidChars(string? s) {
|
|
if (String.IsNullOrWhiteSpace(s)) return "";
|
|
foreach (var c in Path.GetInvalidFileNameChars()) {
|
|
s = s.Replace(c, '-');
|
|
}
|
|
s = s.Replace('_', '-');
|
|
return s;
|
|
}
|
|
|
|
private XElement GetElement() {
|
|
if (_path == null || String.IsNullOrWhiteSpace(_path))
|
|
throw new Exception("Es ist kein Pfad für die XML-Datei vorhanden.");
|
|
|
|
var root = _xmlService.GetRoot(Prefix);
|
|
if (root == null)
|
|
throw new Exception("Kein gültiges Hamann-Dokument: " + _path + "Vom Prefix: " + Prefix);
|
|
|
|
XDocument? doc = null;
|
|
try {
|
|
doc = XDocument.Load(_path, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
|
|
}
|
|
catch (Exception ex) {
|
|
throw new Exception("Fehler beim Lesen des Dokuments: " + ex.Message);
|
|
}
|
|
|
|
if (doc == null || doc.Root == null)
|
|
throw new Exception("Das Dokument ist ungültig und kann nicht gelesen werden: " + _path);
|
|
|
|
var element = root.IsTypeOf(doc.Root);
|
|
if (element == null || !element.Any())
|
|
throw new Exception("Kein gültiges Hamann-Dokument: " + _path + "Vom Prefix: " + Prefix);
|
|
|
|
return element.First();
|
|
}
|
|
|
|
public async Task Save(Stream stream, ModelStateDictionary state) {
|
|
var root = _xmlService.GetRoot(Prefix);
|
|
if (root == null) {
|
|
state.AddModelError("Error", "No corresponding Root Element found.");
|
|
return;
|
|
}
|
|
await root.CreateHamannDocument(Root).SaveAsync(stream, SaveOptions.DisableFormatting, new CancellationToken());
|
|
}
|
|
} |