C#使用生成的Xsd生成的类验证XML

时间:2017-07-20 08:58:21

标签: c# xml xsd

在我们的项目中,我们有从XSD生成的类。目前,我们正在通过XSD文件路径验证针对XSD的XML。

有几个XSD,我们通过数据库中存储的数字选择正确的XSD,如下所示:

  

" C:/项目/ XSD /报告/ Report_的 1.7 的.xsd"
  " C:/项目/ XSD /报告/ Report_的 1.8 的.xsd"

因为当它开始在这样的项目中拥有文件路径时,我会变得有点紧张。这个用例是否有最佳实践?类似于直接针对生成的C#类验证xml。我目前的代码:

    private static string GetXsdPath(SchemaType aSchemaType, string aTransferRevision)
    {
        var lFileBeginnName = XsdStrategies.XsdService.GetXsdName(aSchemaType);
        var lDirectoryName = XsdStrategies.XsdService.GetDirectoryName(aSchemaType);
        string lRoot = HttpContext.Current.Server.MapPath("~");
        string lFullRootPath = Path.GetFullPath(Path.Combine(lRoot, @"../"));

        return string.Format(
            CultureInfo.CurrentCulture, @"{0}/Reports/{1}/Report_V{2}.xsd",
            lFullRootPath,
            lDirectoryName,
            aTransferRevision);
    }

    public bool IsValidXml(string aXmlContent, string aXsdFilePath, XNamespace aNamespaceName)
    {
        try
        {
            if (aNamespaceName == null)
            {
                this.Logger.AddLogEntry(LogLevel.Error, "Namespace is null.");
                return false;
            }

            var lXdoc = XDocument.Parse(aXmlContent);
            var lSchemas = new XmlSchemaSet();
            lSchemas.Add(aNamespaceName.NamespaceName, aXsdFilePath);

            // xDoc Validate throws an excption if xml not conforms xsd.
            lXdoc.Validate(lSchemas, null);
        }
        catch (XmlSchemaValidationException lEx)
        {
            this.Logger.AddLogEntry(LogLevel.Error, $"The Xml is not valid against the Xsd: {lEx}");
            return false;
        }
        catch (XmlSchemaException lEx)
        {
            this.Logger.AddLogEntry(LogLevel.Error, $"Therse is something wrong in the Schema-Version from Xml and Xsd: {lEx}");
            return false;
        }
        catch (XmlException lEx)
        {
            this.Logger.AddLogEntry(LogLevel.Error, $"A generic Error occured durring Xml against Xsd validation: {lEx}");
            return false;
        }

        return true;
    }

1 个答案:

答案 0 :(得分:0)

我建议你将XSD数据直接存储在数据库而不仅仅是路径中,你是非常正确的,这是一个坏主意。

例如,您可以将XSD数据存储在MS SQL Server中的NVarChar数据类型中。