ASP.Net で XSD を参照して XML ファイルをアップロードする
-
20-09-2019 - |
質問
通常のファイル アップロード コントロールを介して 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
財産。
所属していません StackOverflow