From 7818637517c4b24fee4c22e5e0d3a2974c719534 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Wed, 5 Jun 2019 11:23:23 +0200 Subject: [PATCH] refactor xml validation to use xsd type to load according schema --- VectoCore/VectoCore/Utils/XMLDefinitions.cs | 14 +++++++++- VectoCore/VectoCore/Utils/XMLHelper.cs | 12 -------- VectoCore/VectoCore/Utils/XMLValidator.cs | 28 +++++-------------- .../VectoCoreTest/FileIO/JsonWriteTest.cs | 1 - 4 files changed, 20 insertions(+), 35 deletions(-) diff --git a/VectoCore/VectoCore/Utils/XMLDefinitions.cs b/VectoCore/VectoCore/Utils/XMLDefinitions.cs index d54fa72ecb..6ad119ac04 100644 --- a/VectoCore/VectoCore/Utils/XMLDefinitions.cs +++ b/VectoCore/VectoCore/Utils/XMLDefinitions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Xml; namespace TUGraz.VectoCore.Utils { @@ -81,14 +82,25 @@ namespace TUGraz.VectoCore.Utils - public static string GetSchemaFilename(XmlDocumentType type, string version) + public static string GetSchemaFilename(XmlDocumentType type, string xsdType) { if (!schemaFilenames.ContainsKey(type)) { throw new Exception(string.Format("Invalid argument {0} - only use single flags", type)); } var entry = schemaFilenames[type]; + var version = GetSchemaVersion(xsdType); return string.Format(entry, string.IsNullOrWhiteSpace(version) ? "" : "." + version); } + + public static string GetSchemaVersion(string nodeType) + { + var parts = nodeType?.Split(':'); + if (parts?.Length == 2) { + return XMLHelper.GetVersionFromNamespaceUri(parts[0]); + } + + return null; + } } } diff --git a/VectoCore/VectoCore/Utils/XMLHelper.cs b/VectoCore/VectoCore/Utils/XMLHelper.cs index 8202eb1dda..64abf035b0 100644 --- a/VectoCore/VectoCore/Utils/XMLHelper.cs +++ b/VectoCore/VectoCore/Utils/XMLHelper.cs @@ -68,18 +68,6 @@ namespace TUGraz.VectoCore.Utils // return GetVersionFromNamespaceUri(node.NamespaceURI); //} - public static string GetSchemaVersion(XmlNode node) - { - var nodeType = node.Attributes?.GetNamedItem("type", "http://www.w3.org/2001/XMLSchema-instance"); - if (nodeType != null) { - var parts = nodeType.InnerText.Split(':'); - if (parts.Length == 2) { - return GetVersionFromNamespaceUri(nodeType.GetNamespaceOfPrefix(parts[0])); - } - } - return GetVersionFromNamespaceUri(node.NamespaceURI); - } - public static string GetVersionFromNamespaceUri(XNamespace namespaceUri) { const string versionPrefix = "v"; diff --git a/VectoCore/VectoCore/Utils/XMLValidator.cs b/VectoCore/VectoCore/Utils/XMLValidator.cs index 1956b61f67..6d0ece005a 100644 --- a/VectoCore/VectoCore/Utils/XMLValidator.cs +++ b/VectoCore/VectoCore/Utils/XMLValidator.cs @@ -78,26 +78,12 @@ namespace TUGraz.VectoCore.Utils throw new Exception("empty XML document"); } - var version = XMLHelper.GetSchemaVersion(_doc.DocumentElement); + var xsdType = _doc.DocumentElement.Attributes?.GetNamedItem("type", "http://www.w3.org/2001/XMLSchema-instance") + ?.InnerText; - _doc.Schemas = GetXMLSchema(docType, version); + _doc.Schemas = GetXMLSchema(docType, xsdType); _doc.Validate(ValidationCallBack); - //var settings = new XmlReaderSettings(); - //settings.Schemas = GetXMLSchema(docType, version); - //settings.ValidationType = ValidationType.Schema; - //settings.ValidationFlags = - // XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.AllowXmlAttributes; - //settings.ValidationEventHandler += ValidationCallBack; - //var m = new MemoryStream(); - //var w = new XmlTextWriter(m, Encoding.UTF8); - //_doc.WriteTo(w); - //w.Flush(); - //m.Flush(); - //m.Seek(0, SeekOrigin.Begin); - //var r = new XmlTextReader(m); - //var reader = XmlReader.Create(r, settings); - //_doc = new XmlDocument(); - //_doc.Load(reader); + return _valid; } @@ -115,7 +101,7 @@ namespace TUGraz.VectoCore.Utils } } - private static XmlSchemaSet GetXMLSchema(XmlDocumentType docType, string version) + private static XmlSchemaSet GetXMLSchema(XmlDocumentType docType, string xsdType) { var xset = new XmlSchemaSet() { XmlResolver = new XmlResourceResolver() }; @@ -124,7 +110,7 @@ namespace TUGraz.VectoCore.Utils continue; } - var schemaFile = XMLDefinitions.GetSchemaFilename(entry, version); + var schemaFile = XMLDefinitions.GetSchemaFilename(entry, xsdType); if (schemaFile == null) { continue; } @@ -134,7 +120,7 @@ namespace TUGraz.VectoCore.Utils resource = RessourceHelper.LoadResourceAsStream(RessourceHelper.ResourceType.XMLSchema, schemaFile); } catch (Exception e) { throw new Exception( - string.Format("Unknown XML schema! version: {0}, xml document type: {1} ({2})", entry, version, schemaFile), e); + string.Format("Unknown XML schema! version: {0}, xml document type: {1} ({2})", entry, xsdType, schemaFile), e); } var reader = XmlReader.Create(resource, new XmlReaderSettings(), "schema://"); diff --git a/VectoCore/VectoCoreTest/FileIO/JsonWriteTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonWriteTest.cs index a12d7a7f30..f23bdd9ebd 100644 --- a/VectoCore/VectoCoreTest/FileIO/JsonWriteTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/JsonWriteTest.cs @@ -31,7 +31,6 @@ using System.IO; using NUnit.Framework; -using NUnit.Framework.Internal; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.Tests.Utils; -- GitLab