Question

J'ai un fichier XML qui est en cours de téléchargement sur une page ASP.Net via la commande de téléchargement de fichier normal. Quand il se lève, je tente de valider et 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:

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 valider.

Même si je stockaient le XSD localement, il ne serait toujours pas 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" si elle le souhaite.

Dilemme!

(Aux fins de cette question, j'ai pincé le code ci-dessous à partir de: Validation d'un XML contre XSD référencé dans 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);
    }
}
Était-ce utile?

La solution

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

Autres conseils

Je ne peux pas tout à fait faire savoir si vous tentez une validate-contre-tout-schéma-référencé générique, ou si vous avez un schéma spécifique que vous validez contre chaque fois, et sont tout simplement pas sûr de savoir comment gérer les références .

Si c'est celle-ci, puis faire le schéma public sur Internet, et dire aux gens de faire référence par URI.

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

  • l'utilisateur télécharge d'abord un fichier XML.
  • Parse le fichier XML pour une référence de schéma. Dites-leur « références à yourSchema.xsd ont été trouvés, s'il vous plaît télécharger ce fichier ci-dessous. » Avec une nouvelle boîte de téléchargement
  • Ensuite, valider le fichier téléchargé sur le schéma. Pour ce faire, modifiez la propriété Schemas de votre objet settings, au lieu de modifier la propriété ValidationFlags.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top