1

我有一个 XML 文件,它通过正常的文件上传控件上传到 ASP.Net 页面。当它启动时,我正在尝试验证和反序列化 XML。但是,下面的代码对于验证引用它的 XSD 的 XML 文件非常方便,如下所示:

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

但是,如果我上传此 XML 文件,则仅上传 XML 文件,因此 ..\localSchemaPath.xsd 不存在,因此无法验证。

即使我将 XSD 存储在本地,它仍然不太正确,因为 XML 文件可以使用如下模式位置编写:

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

或 xsi:schemaLocation="someurl localSchemaPath.xsd" 或 xsi:schemaLocation="someurl ....\localSchemaPath.xsd" 如果它愿意。

困境!

(出于这个问题的目的,我从以下代码中提取了以下代码:Validating an XML against referenced XSD in C#

using System.Xml;
using System.Xml.Schema;
using System.IO;

public class ValidXSD
{
    public static void Main()
    {
        // Set the validation settings.
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

        // Create the XmlReader object.
        XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);

        // Parse the file. 
        while (reader.Read()) ;
    }

    // Display any warnings or errors.
    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidation error: " + args.Message);
    }
}
4

2 回答 2

1

我无法完全确定您是否正在尝试通用的 validate-against-any-referenced-schema,或者您是否有每次都验证的特定模式,只是不确定如何处理引用。

如果是后者,则将架构公开在互联网上,并告诉人们通过 URI 引用它。

如果是前者,那么我建议如下:

  • 首先,用户上传一个 XML 文件。
  • 解析 XML 文件以获取架构参考。使用新的上传框告诉他们“yourSchema.xsd找到参考;请在下面上传此文件”。
  • 然后,根据上传的架构验证文件。为此,请修改对象的Schemas属性settings,而不是修改ValidationFlags属性。
于 2009-08-28T17:58:10.150 回答
1

这是我用来验证具有本地模式的 xml 的一段代码:

string errors = string.Empty;

try
{
    XmlSchemaSet schemas = new XmlSchemaSet();
    schemas.Add(string.Empty, Page.MapPath("~/xml/Schema.xsd"));
    XmlDocument doc = new XmlDocument();
    doc.Schemas = schemas;
    doc.Load(Page.MapPath("~/xml/sampleXML.xml"));
    //use this line instead of the one above for a string in memory.
    //doc.InnerXml = xmlToValidate;  
    ValidationEventHandler validator = delegate(object send, ValidationEventArgs ve)
                                           {
                                               errors += "\n" + ve.Severity + ": " + ve.Message;
                                           };

    doc.Validate(validator);
}
catch (XmlException xe)
{
    errors += "\n" + xe.Message;
}
catch (XmlSchemaValidationException xe)
{
    errors += "\n" + xe.Message;
}
于 2009-08-28T19:34:52.220 回答