- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 749
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: 897
<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: 914
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.