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