質問

通常のファイル アップロード コントロールを介して ASP.Net ページにアップロードされている XML ファイルがあります。起動すると、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" それがそう望めば。

ジレンマ!

(この質問の目的のために、以下のコードを次から抜粋しました。 C# での参照された XSD に対する XML の検証)

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