2010-06-18 6 views
1

Je dois valider les fichiers XML par rapport aux XSD. Le XML sera téléchargé à partir de l'URL et je le garderai comme StremReader ou XmlDocument. Le XSD retournera de DataBase en tant que nvarchar (max). Je suis interdit de sauvegarder les fichiers localement. Quelqu'un a-t-il un exemple sur la façon de gérer cette situation? J'essaye de cette façon mais je reçois le XmlException "l'élément de racine est manquant".Comment valider, à l'exécution, xml contre xsd sans enregistrer le fichier sur le dossier local?

public void voltaXsd_em_StreamReader() 
{ 
    // strArquivoInteiro will contain the XSD comming from database 
    // as nvarchar(max) but I make simpler here. 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load(@"C:\file.xsd"); 
    string strArquivoInteiro = xmlDoc.OuterXml; 

    byte[] byteArray = Encoding.ASCII.GetBytes(strArquivoInteiro); 
    MemoryStream streamXSD = new MemoryStream(byteArray); 
    StreamReader readerXsd = new StreamReader(streamXSD); 

    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationEventHandler += this.ValidationEventHandler; 

    settings.ValidationType = ValidationType.Schema; 
    settings.Schemas.Add("schema.xsd", XmlReader.Create(readerXsd)); 
    settings.CheckCharacters = true; 

    XmlReader XmlValidatingReader = XmlReader.Create(@"C:\file.xml", settings); 

    XmlTextReader Reader = new XmlTextReader(@"file.xml"); 

    XmlSchema Schema = new XmlSchema(); 

    // Exactly here I am getting the exception 
    // "Root element is missing" and I do not know why. 
    Schema = XmlSchema.Read(readerXsd, ValidationEventHandler); 

    XmlValidatingReader ValidatingReader = new XmlValidatingReader(Reader); 

    //// 6- Setar o tipo de validação para o objeto XmlValidationReader 
    ValidatingReader.ValidationType = ValidationType.Schema; 

    //// 7- Adicionar Schema a coleção de Schemas XmlValidationReader 
    ValidatingReader.Schemas.Add(Schema); 

     try 
     { 
      //--------------- 

      XmlValidatingReader.Read(); 
      XmlValidatingReader.Close(); 

      //// 8- Adicionar o endereço do ValidationEventHandler ao ValidationEventHandler do XmlValidationReader 
      ValidatingReader.ValidationEventHandler += ValidationEventHandler; 

      //9- Validar cada nó 
      while ((ValidatingReader.Read())) 
      { 
      } 

      ValidatingReader.Close(); 
     } 
     catch (Exception ex) 
     { 
      ValidatingReader.Close(); 
      XmlValidatingReader.Close(); 
     } 
    } 

    private void ValidationEventHandler(object sender, ValidationEventArgs args) 
    { 
     bool blnXmlValido; 

     if (args.Severity == XmlSeverityType.Warning) 
     { 
      blnXmlValido = false; 
     } 
     else if (args.Severity == XmlSeverityType.Error) 
     { 
      blnXmlValido = false; 
     } 
     else if (!(string.IsNullOrEmpty(args.Exception.ToString()))) 
     { 
      blnXmlValido = false; 
     } 

     if ((args.Exception != null)) 
     { 
     } 
    } 

Répondre

1

Ceci est un peu difficile à déboguer sans voir un exemple de xml vous envoyer. Avez-vous vérifié que le document XML étant lu contient une balise d'élément racine qui renferme toutes les autres balises?

Cette erreur se produit lorsque votre xml ne contient pas la balise racine et si le document xml est vide.

Vérifiez également que vos opérations de flux sont définies au début du flux.