- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 66
namespace LoggerWrapper.Logger; public class TextBoxLogger : ILogger { public TextBox? TextBox { get; set; } public void Log(LogEntry entry) { TextBox?.AppendText( $@"[{entry.Severity}] {DateTime.Now} {entry.Message} {entry.Exception}"); TextBox?.AppendText(Environment.NewLine); } }Notice:
public TextBox? TextBox { get; set; }Later, I will connect this property to the actual TextBox in Form1. Here’s what my Program.cs looks like:
using LoggerWrapper.Logger; namespace LoggerWrapper { internal static class Program { [STAThread] static void Main() { ApplicationConfiguration.Initialize(); var textBoxLogger = new TextBoxLogger(); var someDiClassHandler = new SomeDiClassHandler(textBoxLogger); Form1 form1 = new Form1(someDiClassHandler); textBoxLogger.TextBox = form1.TbLogger; Application.Run(form1); } } }Notice:
textBoxLogger.TextBox = form1.TbLogger;In Form1, I introduced a property named TbLogger:
namespace LoggerWrapper; public partial class Form1 : Form { public TextBox? TbLogger { get; } private readonly SomeDiClassHandler _someDiClassHandler; public Form1(SomeDiClassHandler someDiClassHandler) { InitializeComponent(); TbLogger = tbLogger; _someDiClassHandler = someDiClassHandler; } private void btnStart_Click(object sender, EventArgs e) { SomeDiClassCommand someDiClassCommand = new SomeDiClassCommand(); _someDiClassHandler.Execute(someDiClassCommand); } }After creating Form1 I will assign TextBox to my TextBoxLogger, and in Form1 constructor I will assign TbLogger to real TextBox, in my case tbLogger:
TbLogger = tbLogger;Example download from here
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 180
<ItemGroup> <PackageReference Include="IKVM.Maven.Sdk" Version="1.8.2"/> <MavenReference Include="net.sf.saxon:Saxon-HE" version="12.5"/> <PackageReference Include="SaxonHE12s9apiExtensions" Version="12.5.9.4"/> </ItemGroup>Use this method to return result as a string which later you can convert to XML as I already explained here:
using net.sf.saxon.s9api; using net.liberty_development.SaxonHE12s9apiExtensions; ... string ValidateXmlFile(string xmlFile, string xslFile) { Processor processor = new Processor(); DocumentBuilder builder = processor.newDocumentBuilder(); XsltTransformer xsltTransformer = processor.newXsltCompiler().Compile(new Uri(xslFile)).load(); var inputNode = builder.Build(new Uri(xmlFile)); xsltTransformer.setInitialContextNode(inputNode); using var stringWriter = new StringWriter(); Serializer serializer = processor.NewSerializer(stringWriter); xsltTransformer.setDestination(serializer); xsltTransformer.transform(); return stringWriter.ToString(); }Example download from here.
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 196
private static string ValidateXmlFile(string inputFile, string transformFile) { try { if (string.IsNullOrWhiteSpace(inputFile)) { throw new FileNotFoundException("Filename is empty"); } inputFile = Path.GetFullPath(inputFile); if (!File.Exists(inputFile)) { throw new FileNotFoundException($"File: {inputFile} not found"); } transformFile = Path.GetFullPath(transformFile); if (!File.Exists(transformFile)) { throw new FileNotFoundException($"File: {transformFile} not found"); } Processor processor = new Processor(); DocumentBuilder builder = processor.NewDocumentBuilder(); builder.BaseUri = new Uri(inputFile); XdmNode inputNode; using (var inputStream = File.OpenRead(inputFile)) { inputNode = builder.Build(inputStream); } XsltCompiler compiler = processor.NewXsltCompiler(); XsltExecutable executable; using (var xsltStream = File.OpenRead(transformFile)) { executable = compiler.Compile(xsltStream); if (compiler.GetErrorList().Count != 0) throw new Exception("Exception loading xsl!"); } XsltTransformer transformer = executable.Load(); transformer.InitialContextNode = inputNode; Serializer serializer = processor.NewSerializer(); using (var stringWriter = new StringWriter()) { serializer.SetOutputWriter(stringWriter); transformer.Run(serializer); string result = stringWriter.ToString(); return result; } } catch (Exception e) { return e.Message; } }
Since validation result is XML, we can parse failed validations like:
IEnumerable<FailedAssert> failedAsserts = doc.Descendants(svrl + "failed-assert") .Select(fa => new FailedAssert { Flag = fa.Attribute("flag")?.Value, Id = fa.Attribute("id")?.Value, Test = fa.Attribute("test")?.Value, Location = fa.Attribute("location")?.Value, Text = fa.Element(svrl + "text")?.Value });SVRL is an abbreviation for 'Schematron Validation Report Language.' FailedAssert class looks like:
public class FailedAssert { public string Flag { get; set; } public string Id { get; set; } public string Test { get; set; } public string Location { get; set; } public string ExceptionMessage { get; set; } public string Text { get; set; } }Example download from here. For this example I used file 01.03a-INVOICE_uncefact.xml which I downloaded from here where I manipulated with DateTimeField. Instead of a date I wrote "test", in order to trigger a failed assertion. I also downloaded XSL file EN16931-CII-validation.xsl from "Koordinierungsstelle für IT-Standards" (KoSIT) GitHub repository.