我有XML文件,该文件正在上传一个ASP.Net 网页,通过正常的文件上传的控制。当它到达我尝试验证和deserialize XML。然而,代码下面是真的非常方便验证XML文件,该文件引用的文件是这样的:

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

然而,如果我上传这个XML文件,只有XML文件被上载,所以..\localSchemaPath.文件不存在,所以它不能验证。

甚至如果我保存的文件在当地,它仍然不会是完全正确作为XML文件可以写一架构中的位置,如:

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

或 xsi:schemaLocation="someurl localSchemaPath.划" 或 xsi:schemaLocation="someurl..................\localSchemaPath.划" 如果是这样希望。

困境!

(对于这个问题,我必须掐代码如下: 验证XML对所引用文件中的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);
    }
}
有帮助吗?

解决方案

下面是一个代码块我用于验证与本地模式的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;
}

其他提示

我不能完全弄清楚你是否试图一个一般验证对任何引用的方案,或者如果你有一个具体的模式进行验证对每一个时间,并只是不知道该如何处理引用。

如果是后者,然后使该架构公开在互联网上,并告诉人们参考,它由URI。

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

  • 第一次用户上传XML文件。
  • 分析XML文件架构的参考。告诉他们"提到 yourSchema.xsd 被发现;请上传这个文件之下",与一个新的传框。
  • 然后,验证的文件上传方案。要做到这一点,修改 Schemas 你的酒店 settings 对象,而不是修改的 ValidationFlags 财产。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top