public static string ToLocalSchemas(this string xml, string xsdFolder, QtiVersion newVersion) { var itemXsdLocation = GetBaseSchemaLocation(QtiResourceType.AssessmentItem, newVersion); var manifestXsdLocation = GetBaseSchemaLocation(QtiResourceType.Manifest, newVersion); xml = xml.Replace($"{itemXsdLocation}", $"{xsdFolder}/{Path.GetFileName(itemXsdLocation)}"); xml = xml.Replace($"{manifestXsdLocation}", $"{xsdFolder}/{Path.GetFileName(manifestXsdLocation)}"); return(xml); }
protected BaseConverter(DirectoryInfo extractedPackageLocation, QtiVersion currentVersion, Func <string, string> beforeItem, Func <string, string> beforeTest, Func <string, string> beforeManifest) { Version = currentVersion; _packageFolder = extractedPackageLocation; Init(beforeItem, beforeTest, beforeManifest); }
public static bool Validate(this XDocument xDoc, QtiVersion version) { var result = true; // Set the validation settings. using var sr = new StringReader(xDoc.ToString()); var reader = version == QtiVersion.Qti22 ? XmlReader.Create(sr, XsdHelper.GetXmlReaderSettingsQti22(ValidationEventHandler)) : version == QtiVersion.Qti30 ? XmlReader.Create(sr, XsdHelper.GetXmlReaderSettingsQti30(ValidationEventHandler)) : XmlReader.Create(sr, XsdHelper.GetXmlReaderSettingsQti21(ValidationEventHandler)); void ValidationEventHandler(object sender, ValidationEventArgs e) { result = false; var orgColor = Console.ForegroundColor; var type = e.Severity; if (type == XmlSeverityType.Warning) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(e.Message); Console.ForegroundColor = orgColor; } if (type == XmlSeverityType.Error) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(e.Message); Console.ForegroundColor = orgColor; } } // Parse the file. while (reader.Read()) { ; } return(result); }
public static void AddLocalSchemasToPackage(this Manifest manifest, string packageLocation, QtiVersion newVersion) { var controlResources = manifest .FindElementsByElementAndAttributeStartValue("resource", "type", "controlfile/xmlv1p0") .FirstOrDefault(); if (controlResources == null) { var resources = manifest.FindElementByName("resources"); controlResources = XElement.Parse("<resource identifier=\"I_00001_CF\" type=\"controlfile/xmlv1p0\"></resource>"); resources?.Add(controlResources); } var xsdFolder = Path.Combine(packageLocation, "controlxsds"); if (!Directory.Exists(xsdFolder)) { Directory.CreateDirectory(xsdFolder); } var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); var version = newVersion == QtiVersion.Qti21 ? "21" : newVersion == QtiVersion.Qti22 ? "22" : "30"; var schemaLocation = $"Xsds/schema_qti{version}.zip"; ZipFile.ExtractToDirectory(Path.Combine(applicationPath, schemaLocation), xsdFolder, Encoding.Default, true); Directory.GetFiles(xsdFolder, "*.xsd").ToList().ForEach(xsdFile => { controlResources?.Add(XElement.Parse($"<file href=\"controlxsds/{Path.GetFileName(xsdFile)}\" />")); }); }
public static string ReplaceSchemas(this string xml, QtiResourceType resourceType, QtiVersion newVersion, QtiVersion oldVersion, bool localSchema) { var tagName = resourceType == QtiResourceType.AssessmentItem ? "assessmentItem" : resourceType == QtiResourceType.AssessmentTest ? "assessmentTest" : "manifest"; var baseScheme = GetBaseSchema(resourceType, newVersion); var baseSchemeLocation = GetBaseSchemaLocation(resourceType, newVersion); var qtiParentTag = Regex.Match(xml, $"<{tagName}(.*?)>").Value; var qtiParentOrg = qtiParentTag; var schemaPrefix = Regex.Match(qtiParentTag, " (.*?)schemaLocation") .Value.Replace(":schemaLocation", "").Trim(); schemaPrefix = schemaPrefix.Substring(schemaPrefix.LastIndexOf(" ", StringComparison.Ordinal), schemaPrefix.Length - schemaPrefix.LastIndexOf(" ", StringComparison.Ordinal)).Trim(); var schemaLocations = Regex.Match(qtiParentTag, @$ "{schemaPrefix}:schemaLocation=" "(.*?)" "").Value; var extensionSchemas = RemoveSchemaFromLocation(schemaLocations, GetBaseSchema(resourceType, oldVersion)); if (resourceType == QtiResourceType.Manifest) { extensionSchemas = RemoveSchemaFromLocation(extensionSchemas, GetBaseSchema(QtiResourceType.AssessmentItem, oldVersion)); extensionSchemas = extensionSchemas + $" {GetBaseSchema(QtiResourceType.AssessmentItem, newVersion)} {GetBaseSchemaLocation(QtiResourceType.AssessmentItem, newVersion)}"; } qtiParentTag = Regex.Replace(qtiParentTag, @$ "{schemaPrefix}:schemaLocation=" "(.*?)" "", ""); qtiParentTag = Regex.Replace(qtiParentTag, @$ "xmlns:{schemaPrefix}=" "(.*?)" "", ""); qtiParentTag = Regex.Replace(qtiParentTag, @$ "xmlns:xsi=" "(.*?)" "", ""); qtiParentTag = Regex.Replace(qtiParentTag, @"xmlns=""(.*?)""", ""); if (localSchema) { var prefix = resourceType == QtiResourceType.Manifest ? "/" : "../"; baseSchemeLocation = $"{prefix}controlxsds/{Path.GetFileName(baseSchemeLocation)}"; } var schemaLocation = $"xsi:schemaLocation=\"{baseScheme} {baseSchemeLocation} "; qtiParentTag = qtiParentTag.Replace($"{tagName} ", $@"{tagName} xmlns=""{baseScheme}"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" " + schemaLocation + " " + extensionSchemas + @""" " ); xml = xml.Replace(qtiParentOrg, qtiParentTag); if (schemaPrefix != "xsi") { xml = xml.Replace($":{schemaPrefix}", ":xsi"); xml = xml.Replace($"{schemaPrefix}:", "xsi:"); } return(xml); }
public static string GetBaseSchemaLocation(QtiResourceType resourceType, QtiVersion version) => XsdHelper.BaseSchemaLocations[$"{resourceType.ToString()}-{version.ToString()}"];
private static string GetBaseSchema(QtiResourceType resourceType, QtiVersion version) => XsdHelper.BaseSchemas[$"{resourceType}-{version}"];
public Manifest(DirectoryInfo packageLocation, QtiVersion version, Func <string, string> beforeManifest) : base(Parse(beforeManifest(File.ReadAllText(Path.Combine(packageLocation.FullName, "imsmanifest.xml"))))) { _packageLocation = packageLocation; _version = version; }
protected BaseConverter(DirectoryInfo extractedPackageLocation, QtiVersion currentVersion) : this(extractedPackageLocation, currentVersion, x => x, x => x, x => x) { }
public Qti30Converter(DirectoryInfo extractedPackageLocation, bool localSchema, QtiVersion fromVersion) : base( extractedPackageLocation, xml => xml .ReplaceRunsTabsAndLineBraks() .ReplaceSchemas(QtiResourceType.AssessmentItem, QtiVersion.Qti30, fromVersion, localSchema), testXml => testXml .ReplaceRunsTabsAndLineBraks() .ReplaceSchemas(QtiResourceType.AssessmentTest, QtiVersion.Qti30, fromVersion, localSchema), manifestXml => manifestXml .ReplaceRunsTabsAndLineBraks() .ReplaceSchemas(QtiResourceType.Manifest, QtiVersion.Qti30, fromVersion, localSchema) ) { }