maksit-postclient/src/MaksIT.PostClient.Shared/RemEvidenceParser.cs
Maksym Sadovnychyy b560a64574 (feature): init
2026-09-13 16:47:17 +02:00

64 lines
1.7 KiB
C#

using System.Xml;
namespace MaksIT.PostClient.Shared;
public static class RemEvidenceParser {
public sealed class Data {
public string Event { get; init; } = "";
public string RelatedMessageId { get; init; } = "";
public string EvidenceId { get; init; } = "";
}
public static Data? Parse(string? xml) {
if (!EnvelopeClassifier.LooksLikeEtsi(xml))
return null;
try {
var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Prohibit,
XmlResolver = null,
IgnoreComments = true
};
var document = new XmlDocument { XmlResolver = null };
using (var reader = XmlReader.Create(new StringReader(xml!), settings))
document.Load(reader);
var ev = First(document, "EventCode", "eventCode", "EvidenceType", "eventType", "Type");
var related = First(
document,
"RelatesTo",
"RelatedTo",
"OriginalMessageId",
"MessageIdentifier",
"UAMessageId",
"msgid");
var id = First(document, "EvidenceIdentifier", "EvidenceId", "identificativo");
if (string.IsNullOrWhiteSpace(ev) && string.IsNullOrWhiteSpace(related))
return null;
return new Data {
Event = ev,
RelatedMessageId = related,
EvidenceId = id
};
}
catch {
return null;
}
}
private static string First(XmlDocument document, params string[] names) {
foreach (var name in names) {
var nodes = document.GetElementsByTagName(name);
foreach (XmlNode node in nodes) {
var text = (node.InnerText ?? "").Trim();
if (text.Length > 0)
return text;
}
}
return "";
}
}