Validate EDI (XML, Edifact and Ansi X12)
Site
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:
- Create Edifact Icon in SVG
- Tools needed:
- Inkscape SVG editor
- Fontforge: Create WOF2 package
- Validate file content
- Additional upload for schematron valditation, styling and calculation:
- Document examples from Pagero:
- Document styling
- Display XML content on web page: (Done)
- Edifact example source / projects
- favicon (Done)
- Popup window with validation messages (Abandoned)
- Milliseconds elapsed (Done)
Sandcastle
Use local postman for testing?
Unit test
Check for vulnerability
GDPR (mostly done)
Information or questions: Please contact plykkegaard at gmail dot com
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();
}
}
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