2009-08-28 5 views
1

J'ai un fichier XML qui est téléchargé sur une page ASP.Net via le contrôle de téléchargement de fichier normal. Quand il se lève, j'essaye de valider et de désérialiser le XML. Cependant, le code ci-dessous est vraiment très pratique pour valider un fichier XML qui fait référence à c'est XSD comme ceci:Chargement d'un fichier XML, en référence à un fichier XSD, dans ASP.Net

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

Cependant, si je télécharge ce fichier XML, seul le fichier XML obtient téléchargé, donc .. \ localSchemaPath. xsd n'existe pas, donc il ne peut pas valider.

Même si je stockaient le XSD localement, il ne serait pas encore tout à fait raison que le fichier XML peut être écrit avec un emplacement de schéma comme:

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

ou xsi: schemaLocation = "someurl localSchemaPath. xsd " ou xsi: schemaLocation =" someurl .................. \ localSchemaPath.xsd " s'il le souhaitait.

Dilemme!

(Aux fins de cette question, j'ai pincé le code ci-dessous à partir de: 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); 
    } 
} 

Répondre

1

Voici un morceau de code que j'utilise pour valider XML avec un schéma local:

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

Je ne peux pas tout à fait faire savoir si vous essayez un générique validate-contre-any- referenced-schema, ou si vous avez un schéma spécifique que vous validez à chaque fois, et que vous ne savez pas comment gérer les références. Si c'est le dernier, rendez le schéma public sur Internet et dites aux gens de le référencer par URI.

Si c'est le premier, alors je suggère ce qui suit:

  • premier l'utilisateur télécharge un fichier XML.
  • Analyse du fichier XML pour une référence de schéma. Dites-leur "Des références à yourSchema.xsd ont été trouvées, s'il vous plaît télécharger ce fichier ci-dessous" avec une nouvelle boîte de téléchargement.
  • Puis, validez le fichier par rapport au schéma téléchargé. Pour ce faire, modifiez la propriété Schemas de votre objet settings au lieu de modifier la propriété ValidationFlags.
Questions connexes