Как проверить, во время выполнения, xml против xsd без сохранения файла в локальной папке? - PullRequest
1 голос
/ 19 июня 2010

Мне нужно проверить файлы XML на соответствие XSD.XML будет загружен с URL, и я буду хранить его как StremReader или XmlDocument.XSD вернется из базы данных как nvarchar (max).Мне запрещено сохранять файлы локально.У кого-нибудь есть пример, как справиться с этой ситуацией?Я пытаюсь таким образом, но я получаю XmlException "Корневой элемент отсутствует".

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))
        {
        }
    }

1 Ответ

1 голос
/ 19 июня 2010

Это немного сложно отладить, не увидев пример отправляемого вами XML-документа. Вы убедились, что читаемый XML-документ содержит тег корневого элемента, который охватывает все другие теги?ошибка возникает, когда в xml отсутствует корневой тег, а также если документ xml пуст.

Также убедитесь, что для потоковых операций задано начало потока.

...