.NET C# Dicas Programação

Validando SCHEMA XML usando XSD e C#

Mais um problema recorrente. Normalmente temos que gerar ou enviar XML para clientes com a informação de nossos CRMs. Isso costuma causar alguma dor de cabeça quando não se tem um arquivo XSD com o SCHEMA que deve ser seguido pelo XML.

Pensando nisso, preparei esse código que é para ser aplicado em uma aplicação winforms, com 2 inputs, um arquivo XSD e um XML e o output vai para um TXT multiline. Espero que ajude.

Para começar, você precisará criar um novo projeto WinForms no Visual Studio. Em seguida, adicione os seguintes controles ao seu formulário: dois botões (um para selecionar o arquivo XSD e outro para selecionar o arquivo XML), um controle TextBox para exibir o resultado da validação e um controle OpenFileDialog para permitir ao usuário selecionar os arquivos.

Em seguida, você precisará adicionar as seguintes bibliotecas ao seu projeto:

using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

A primeira biblioteca é necessária para trabalhar com arquivos e diretórios. As outras duas bibliotecas são usadas para validar o arquivo XML com o arquivo XSD.

Abaixo está o código completo para a aplicação:

using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Windows.Forms;

namespace ExemploValidacaoXML
{
    public partial class Form1 : Form
    {
        private OpenFileDialog openFileDialog1 = new OpenFileDialog();
        private OpenFileDialog openFileDialog2 = new OpenFileDialog();

        public Form1()
        {
            InitializeComponent();
            openFileDialog1.Filter = "XSD files (*.xsd)|*.xsd";
            openFileDialog2.Filter = "XML files (*.xml)|*.xml";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (openFileDialog2.ShowDialog() == DialogResult.OK)
            {
                textBox2.Text = openFileDialog2.FileName;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                string xsdPath = textBox1.Text;
                string xmlPath = textBox2.Text;
                string validationMessage = string.Empty;

                // Load the XSD schema.
                XmlSchemaSet schemaSet = new XmlSchemaSet();
                schemaSet.Add(null, xsdPath);

                // Load the XML file.
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.Schema;
                settings.Schemas = schemaSet;

                // Set the validation event handler.
                settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);

                // Create the XmlReader object.
                XmlReader reader = XmlReader.Create(xmlPath, settings);

                // Read the XML file.
                while (reader.Read()) { }

                if (string.IsNullOrEmpty(validationMessage))
                {
                    validationMessage = "O arquivo XML é válido de acordo com o esquema XSD especificado.";
                }

                textBox3.Text = validationMessage;
            }
            catch (Exception ex)
            {
                textBox3.Text = ex.Message;
            }
        }

        private void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            if (e.Severity == XmlSeverityType.Error)
            {
                textBox3.Text += "Erro: " + e.Message + Environment.NewLine;
            }
            else
            {
                textBox3.Text += "Aviso: " + e.Message + Environment.NewLine;
            }
        }
    }
}

Explicação do código:

  • No construtor do formulário, definimos o filtro de arquivos para cada controle OpenFileDialog. O primeiro controle OpenFileDialog é usado para selecionar o arquivo XSD e o segundo é usado para selecionar o arquivo XML.
  • No evento Click do botão “Selecionar XSD”, definimos o texto do controle TextBox1 com o caminho do arquivo XSD selecionado pelo usuário.
  • No evento Click do botão “Selecionar XML”, definimos o texto do controle TextBox2 com o caminho do arquivo XML selecionado pelo usuário.
  • No evento Click do botão “Validar”, carregamos o esquema XSD e o arquivo XML e executamos a validação. Para carregar o esquema XSD, criamos um objeto XmlSchemaSet e adicionamos o arquivo XSD especificado pelo usuário. Para carregar o arquivo XML, criamos um objeto XmlReaderSettings e definimos a propriedade ValidationType como “Schema” e a propriedade Schemas como o XmlSchemaSet que acabamos de criar. Em seguida, definimos o manipulador de eventos ValidationEventHandler para lidar com erros e avisos de validação.
  • Quando a validação é concluída, verificamos se há mensagens de validação. Se não houver mensagens, definimos a mensagem “O arquivo XML é válido de acordo com o esquema XSD especificado.” no controle TextBox3. Caso contrário, definimos as mensagens de validação no controle TextBox3.
  • Finalmente, criamos o método ValidationEventHandler para manipular erros e avisos de validação. Se a gravidade do erro for XmlSeverityType.Error, adicionamos uma mensagem de erro ao controle TextBox3. Caso contrário, adicionamos uma mensagem de aviso.
  • Espero que este exemplo seja útil para você. Se tiver alguma dúvida, não hesite em perguntar.

Ajudou a você ? deixe um cometário! Obrigado.

Lucas Dalcolmo

About Author

Sou desenvolvedor de software a mais de 13 anos com experiência nacioanl e internacional. Já produzi softwares para grandes empresas no Brasil e também bancos em Portugal. Possuo as certificações microsoft AZ-900, DP-900, AI-900 e AZ-204 (azure developer associate). Sou fundador da Dallm Games Studio (@dallmgamesstudio) e fui mentor em vários eventos de desenvolvimento de jogos. Também fui mentor do NASA SPACE JAM 2024 na área de desenvolvimento de software.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Receba as últimas notícias por email

    Cadastre-se, receba nossas novidades em primeira mão por email, antes de todo mundo.

    Codeinsider @2025. Todos os direitos reservados.

    Desenvolvido por House Comunicação