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.