2009-08-28 3 views
1

に、私は通常のファイルアップロードコントロールを経由してASP.NetページにアップロードされているXMLファイルを持って、XSDを参照し、XMLファイルをアップロードします。それが起きると、私はXMLを検証して逆シリアル化しようとしています。ただし、以下のコードは、実際にそれがこのようなXSDだ参照するXMLファイルを検証するために非常に便利です:私は、このXMLファイルをアップロードする場合は、唯一のXMLファイルがアップロードされ、そう.. \ localSchemaPathますはASP.Net

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

。 xsdは存在しないため、検証できません。

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

または XSI::のschemaLocation = "someurlのlocalSchemaPath XMLファイルのようなスキーマの場所で書くことができますよう

私はローカルXSDを保存した場合でも、それはまだかなり右ではないでしょう。 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); 
    } 
} 

答えて

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; 
} 
1

私はかなりあなたは、一般的な検証-に対する-any-をしようとしているかどうかを作ることができません参照スキーマ、または毎回検証する特定のスキーマがあり、参照の処理方法がわからない場合は、

後者の場合は、インターネット上でスキーマを公開し、URIで参照するように指示します。

それはかつてのなら、私は次のことをお勧めします:

  • まず、ユーザはXMLファイルをアップロードします。
  • スキーマ参照のXMLファイルを解析します。新しいアップロードボックスを使用して「yourSchema.xsdへの参照が見つかりました。以下でこのファイルをアップロードしてください。
  • 次に、アップロードされたスキーマに対してファイルを検証します。これを行うにはプロパティを変更するのではなく、settingsオブジェクトのSchemasプロパティを変更します。ここで