Validate EDI

Validate EDI (XML, Edifact and Ansi X12)  

Functionality

  • Multiupload
    • No data is stored on the server
    • MIME type is detected based on file content
      • It is possible to upload without file extensiom
      • All other files than text (edifact / ansi x12) or xml are skipped / not supported
  • Validate structure (eg schema validation)
  • Validate business logic (eg schematron validation)
  • XSLT Styling, readable document in HTML
  • Calculate content and compare with values in eg an invoice

Milestones

Current task

  • Scoped the project, only a few XML and EDIFACT versions will be implemented
    • OIOUBL (danish adaption of the UBL standard)
    • Peppol BIS
    • Standard eg EDIFACT D96 are considere in a limited version as a start as a proof of concept
    • cXML and xCBL are a possibility
  • Store validation classes / objects in memory cache to use on subsequent requests
  • XSLT transformations uses SaxonHE
    • All stylesheet versions are supported
    • Included stylesheets or XML documents are supported
  • Documentation of source code (XML documentation)
    • SandCastle is used to generate HTML or MD documents
    • Add content documentation to source code

Release

  •  WIP
    • Jun 23: Only local test / development atm, date for a first beta release not estimated
    • Oct 23: Slow process with local test / development, getting closer to a beta release 
    • Dec 23: Testing, prepare for release on VPS with Ubuntu
    • Jan 14: Project running on VirtualBox / Ubuntu 23.10 / NET 8
      • NGINX as Reverse Proxy in fron of Kestrel web server
    • Jan 14: Test memory usage to validate 8 Gb mem limit
    • Jan 23: Released on https://www.validatefile.dk
      • VPS with 2 CPU, 8 Gb mem running Ubuntu 23.10 server and .NET 8
    • Feb 07: Small adjustment, preparation for xCBL and cXML validation, About page added

To do list for project: 

Sandcastle

Use local postman for testing?

Unit test

Check for vulnerability

GDPR (mostly done)

Information or questions: Please contact plykkegaard at gmail dot com

Get document description using xmlreader

C# .NET Core 6: Get rootname, namespace or DTD using xmlreader

using (var stream = new MemoryStream())
{
	FormFile?.CopyTo(stream);
	stream.Seek(0, SeekOrigin.Begin);

	var settings = new XmlReaderSettings()
	{
		// Parse file but do not reolve
		DtdProcessing = DtdProcessing.Parse,
		XmlResolver = null
	};

	using (var reader = XmlReader.Create(stream, settings))
	{
		var done = false;

		while (reader.Read() && !done)
		{
			// something weird happened, bail out
			//if (reader.EOF)
			//	return;

			switch (reader.NodeType)
			{
				// Assume cXML
				case XmlNodeType.DocumentType:
					DocumentType = reader.GetAttribute("SYSTEM") + "";
					break;

				case XmlNodeType.Element:
					switch (reader.LocalName)
					{
						// Assume an UBL dpcument of some kind
						case "CustomizationID":
							reader.Read();
							SetCustomization(reader.Value);
							break;

						// Only OIOUBL, done and exit
						case "UBLlVersionID":
							reader.Read();
							UblVersion = reader.Value;
							done = true;
							break;

						// Only OIOXML, done and exit
						case "TypeCode":
							reader.Read();
							TypeCode = reader.Value;
							done = true;
							break;

						default:
							if (string.IsNullOrEmpty(RootName))
							{
								RootName = reader.Name;
								SetNamespace(reader.NamespaceURI);
							}
							break;
					}
					break;
			}
		}
		reader.Close();
	}
}



Unit Test: XSLT transformations using XMLUnit.NET

XSLT transformations using XMLUnit.NET

Load source document and call transformation

//    -----------------------------
var source = Org.XmlUnit.Builder.Input.ByTransforming(Org.XmlUnit.Builder.Input.FromFile(""))
	.WithStylesheet(Org.XmlUnit.Builder.Input.FromFile(""))
	.Build();

References