Um web service (WebMethod) já retorna um XML por padrão.
O problema é que o web service não serializa todas as propriedades de um objeto
Então, neste artigo vou mostrar algumas formas de retornar XML de um web service, seja um XML simples ou mais complexo.
Já sabemos que o WebMethod retorna um XML padrão. Abaixo vamos ver um exemplo disso.
[WebMethod]
public List<Usuario> RetornarXMLSimples(string word, int n)
{
List<Usuario> usuarios = new List<Usuario>();
for (int i = 0; i < n; i++)
{
Usuario usuario = new Usuario();
usuario.Nome = word + i;
usuario.Idade = i;
usuarios.Add(usuario);
}
return usuarios;
}
public class Usuario
{
public string Nome { get; set; }
public int Idade { get; set; }
}
Resultado:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfUsuario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<Usuario>
<Nome>Cassiano0</Nome>
<Idade>0</Idade>
</Usuario>
<Usuario>
<Nome>Cassiano1</Nome>
<Idade>1</Idade>
</Usuario>
<Usuario>
<Nome>Cassiano2</Nome>
<Idade>2</Idade>
</Usuario>
</ArrayOfUsuario>
Agora vamos resolver o problema de serializar todas as propriedades de uma classe.
Em um artigo publicado anteriormente, Serializar objetos para XML - C#, mostrei como fazer isso, então vou usar a mesma base para montar nosso segundo exemplo que vai utilizar o XmlElement, XmlAttribute na declaração de propriedades de classe.
Criar classe Serializável (converter classe para XML)
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public xml RetornarXML(string word, string n)
{
//Criar a lista de contatos
List<Contato> contatos = new List<Contato>();
//Popular a lista de contatos
for (int i = 0; i < Convert.ToInt32(n); i++)
{
Contato contato = new Contato();
contato.nome = word + i;
contato.email = word + i + "@cbsa.com.br";
contatos.Add(contato);
}
//Popular a Classe xml
xml dadosXML = new xml(contatos);
//Retornar o xml
return dadosXML;
}
[XmlRoot("xml")]
public class xml
{
public xml() { }
public xml(List<Contato> contatos)
{
this.contatos = contatos;
}
public List<Contato> contatos { get; set; }
}
public class Contato
{
[XmlAttribute("ativo")]
public bool ativo;
[XmlElement("nome")]
public string nome { get; set; }
[XmlElement("email")]
public string email { get; set; }
}
Resultado:
<?xml version="1.0" encoding="utf-8"?>
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<contatos>
<Contato ativo="false">
<nome>codebreak0</nome>
<email>[email protected]</email>
</Contato>
<Contato ativo="false">
<nome>codebreak1</nome>
<email>[email protected]</email>
</Contato>
<Contato ativo="false">
<nome>codebreak2</nome>
<email>[email protected]</email>
</Contato>
</contatos>
</xml>
Então qual é a melhor forma de criar um web service para retornar XML?
A resposta é, vai depender de sua necessidade.