none
Validar arquivo xml RRS feed

  • Pergunta

  • Boa tarde.

    Tenho um arquivo xml e xsd que utilizo como fonte de dados de um relatorio. Segue:

    xsd

    ?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified"
            elementFormDefault="qualified"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Relatorio">
          <xs:complexType>
             <xs:sequence>
                <xs:element maxOccurs="unbounded" name="Cabecalho">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="INFO01" type="xs:string" />
                      <xs:element name="INFO02" type="xs:string" />
                      <xs:element name="INFO03" type="xs:string" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
                <xs:element maxOccurs="unbounded" name="Conteudo">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="INFO01" type="xs:string" />                  
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

    xml 

    <?xml version="1.0" encoding="utf-8"?>
    <Relatorio>
      <Conteudo>
        <INFO01>17/01/2012</INFO01>
        <INFO02>07:43:30</INFO02>
        <INFO03>FUNCIONARIO 1</INFO03>    
      </Conteudo>  
      <Cabecalho>
        <INFO01>RELATORIO DE EVENTOS</INFO01>    
      </Cabecalho>
    </Relatorio>
    
    

    A partir de uma consulta no banco eu alimento os nós Conteudo e  Cabecalho. Já aconteceu de estar preenchendo o xml e por algum erro, perda de conexão por exemplo, ele não fechou um elemento, ficando incompleto, ou seja, um xml inválido.

    Quando tentei carregar este documento pelo XDocument.Load(), ocorreu o erro abaixo.

    XDocument XMLReport = XDocument.Load(strArquivo);
    
    Erro: Unexpected end of file has occurred. The following elements are not closed: Relatorio.
    
    

    Eu preciso fazer o seguinte: Como eu crio vários nós <Conteudo>, preciso validar de alguma forma se este nó é valido antes de salvá-lo. Como fazer isto?

    Como tenho o xsd, preciso validar este arquivo. Preciso gerar um arquivo valido Como fazer isto em c#?

    Att.

    Teles

     

    quinta-feira, 19 de janeiro de 2012 16:54

Respostas

  • Teles veja se isto te ajuda para validação de XMl antes de salvar o memso:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    using System.Xml.Linq;
    using System.Xml;
    using System.Xml.Schema;
    using System.IO;
    
    namespace ConsoleApplication3
    {
        class Program
        {
            public static bool ValidationErrors = false;
    
            static void Main(string[] args)
            {
                //XSD para validar
                string xsd = @"<?xml version='1.0'?>
                                <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
                                  <xsd:element name='Employee'>
                                    <xsd:complexType>
                                      <xsd:sequence>
                                        <xsd:element name='EmployeeName' type='xsd:string'/>
                                      </xsd:sequence>
                                      <xsd:attribute name='EmployeeID' use='required' type='xsd:int'/>
                                    </xsd:complexType>
                                  </xsd:element>
                                </xsd:schema>";
    
                string xmlValido = @"<?xml version='1.0'?>
                                    <Employee EmployeeID='123'>
                                        <EmployeeName>Rugby jersey</EmployeeName>                                    
                                    </Employee>";
    
                string xmlInvalido = @"<?xml version='1.0'?>
                                    <Employee EmployeeID='123'>
                                        <EmployeeName>Rugby jersey</EmployeeName>
                                        <EmployeeNam>Rugby jersey</EmployeeNam>
                                    </Employee>";
    
                var xDocXSD = XDocument.Parse(xsd);
                var xDocXmlValido = XDocument.Parse(xmlValido).CreateReader();
                var xDocXmlInvalido = XDocument.Parse(xmlInvalido).CreateReader();
    
                //Instancia da classe para validar XML
                SchemaValidator s = new SchemaValidator();
    
                //Validando XML valido
                if (s.ValidateXML(xDocXmlValido, xDocXSD.CreateReader()))
                    Console.WriteLine("Invalido");
                else
                    Console.WriteLine("Valido");
    
                Console.WriteLine("--");
    
                //Validando XML invalido
                if (s.ValidateXML(xDocXmlInvalido, xDocXSD.CreateReader()))
                    Console.WriteLine("Invalido");
                else
                    Console.WriteLine("Valido");
    
                Console.Read();
            }
            public class SchemaValidator
            {
                public bool ValidateXML(XmlReader XMLFile, XmlReader XSDFile)
                {
                    ValidationErrors = false;
    
                    XmlReader schemaReader = XSDFile;
    
                    XmlReaderSettings readerSettings = new XmlReaderSettings();
                    readerSettings.ValidationType = ValidationType.Schema;
                    readerSettings.Schemas.Add("", schemaReader);
                    readerSettings.ValidationEventHandler += OnValidate;
    
                    ValidationErrors = false;
    
                    XmlReader xr = XmlReader.Create(XMLFile, readerSettings);
                    using (xr)
                        while (xr.Read()) ;
    
                    return ValidationErrors;
                }
    
                private void OnValidate(object sender, ValidationEventArgs e)
                {
                    ValidationErrors = true;
                    Console.WriteLine(e.Message);
                }
    
            }
        }
    }
    
    

    Referencia:
    http://ericlemes.com/2011/04/26/dotnet-schema/  
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    sexta-feira, 20 de janeiro de 2012 14:32
  • Acho que o modo mais facil de você fazer isso sem precisar de Validator. 

    É só adicione o nó no final de todo o processo, se cair a conexão com o banco irá disparar uma exceção então você não irá adicionar o nó.

    Outro modo é você utilizar o XSD que valida a estrutura do seu XML. Assim você nunca adicionar um XML que não passou na validação do XSD.

    O XSD é um arquivo que você criar para dizer como será o seu xml um template literalmente que fica de fácil validação do XML.

    Segue abaixos links.

     

    http://www.techbubbles.com/webservices/validating-xml-document-using-xsd-in-cnet/

    http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/8d86fa30-a51b-4d21-91c8-8f5343ac32df

    http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=xsd+learn

    sábado, 21 de janeiro de 2012 23:24

Todas as Respostas

  • Teles veja se isto te ajuda para validação de XMl antes de salvar o memso:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    using System.Xml.Linq;
    using System.Xml;
    using System.Xml.Schema;
    using System.IO;
    
    namespace ConsoleApplication3
    {
        class Program
        {
            public static bool ValidationErrors = false;
    
            static void Main(string[] args)
            {
                //XSD para validar
                string xsd = @"<?xml version='1.0'?>
                                <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
                                  <xsd:element name='Employee'>
                                    <xsd:complexType>
                                      <xsd:sequence>
                                        <xsd:element name='EmployeeName' type='xsd:string'/>
                                      </xsd:sequence>
                                      <xsd:attribute name='EmployeeID' use='required' type='xsd:int'/>
                                    </xsd:complexType>
                                  </xsd:element>
                                </xsd:schema>";
    
                string xmlValido = @"<?xml version='1.0'?>
                                    <Employee EmployeeID='123'>
                                        <EmployeeName>Rugby jersey</EmployeeName>                                    
                                    </Employee>";
    
                string xmlInvalido = @"<?xml version='1.0'?>
                                    <Employee EmployeeID='123'>
                                        <EmployeeName>Rugby jersey</EmployeeName>
                                        <EmployeeNam>Rugby jersey</EmployeeNam>
                                    </Employee>";
    
                var xDocXSD = XDocument.Parse(xsd);
                var xDocXmlValido = XDocument.Parse(xmlValido).CreateReader();
                var xDocXmlInvalido = XDocument.Parse(xmlInvalido).CreateReader();
    
                //Instancia da classe para validar XML
                SchemaValidator s = new SchemaValidator();
    
                //Validando XML valido
                if (s.ValidateXML(xDocXmlValido, xDocXSD.CreateReader()))
                    Console.WriteLine("Invalido");
                else
                    Console.WriteLine("Valido");
    
                Console.WriteLine("--");
    
                //Validando XML invalido
                if (s.ValidateXML(xDocXmlInvalido, xDocXSD.CreateReader()))
                    Console.WriteLine("Invalido");
                else
                    Console.WriteLine("Valido");
    
                Console.Read();
            }
            public class SchemaValidator
            {
                public bool ValidateXML(XmlReader XMLFile, XmlReader XSDFile)
                {
                    ValidationErrors = false;
    
                    XmlReader schemaReader = XSDFile;
    
                    XmlReaderSettings readerSettings = new XmlReaderSettings();
                    readerSettings.ValidationType = ValidationType.Schema;
                    readerSettings.Schemas.Add("", schemaReader);
                    readerSettings.ValidationEventHandler += OnValidate;
    
                    ValidationErrors = false;
    
                    XmlReader xr = XmlReader.Create(XMLFile, readerSettings);
                    using (xr)
                        while (xr.Read()) ;
    
                    return ValidationErrors;
                }
    
                private void OnValidate(object sender, ValidationEventArgs e)
                {
                    ValidationErrors = true;
                    Console.WriteLine(e.Message);
                }
    
            }
        }
    }
    
    

    Referencia:
    http://ericlemes.com/2011/04/26/dotnet-schema/  
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    sexta-feira, 20 de janeiro de 2012 14:32
  • Acho que o modo mais facil de você fazer isso sem precisar de Validator. 

    É só adicione o nó no final de todo o processo, se cair a conexão com o banco irá disparar uma exceção então você não irá adicionar o nó.

    Outro modo é você utilizar o XSD que valida a estrutura do seu XML. Assim você nunca adicionar um XML que não passou na validação do XSD.

    O XSD é um arquivo que você criar para dizer como será o seu xml um template literalmente que fica de fácil validação do XML.

    Segue abaixos links.

     

    http://www.techbubbles.com/webservices/validating-xml-document-using-xsd-in-cnet/

    http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/8d86fa30-a51b-4d21-91c8-8f5343ac32df

    http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=xsd+learn

    sábado, 21 de janeiro de 2012 23:24