{"id":67,"date":"2022-02-22T11:51:00","date_gmt":"2022-02-22T14:51:00","guid":{"rendered":"https:\/\/dumba.dev.br\/?p=67"},"modified":"2026-01-13T11:52:46","modified_gmt":"2026-01-13T14:52:46","slug":"como-converter-xml-em-objetos-no-c-de-forma-simples","status":"publish","type":"post","link":"https:\/\/dumba.dev.br\/index.php\/2022\/02\/22\/como-converter-xml-em-objetos-no-c-de-forma-simples\/","title":{"rendered":"Como converter XML em Objetos no C# de forma simples"},"content":{"rendered":"\n<p>Ol\u00e1 povo! Nesses \u00faltimos dias estava trabalhando em um projeto legado e precisei dar manuten\u00e7\u00e3o em uma estrutura para leitura de XML, convert\u00ea-los em objetos de dom\u00ednio e utilizar os dados no projeto, por\u00e9m me deparei com leituras de XML com o XmlElement e suas subclasses. Mas eles funcionam? Claro que Sim, mas existe uma maneira muito mais simples de pegar os dados de um arquivo XML e converter em um Objeto e vou te mostrar como.&nbsp;<\/p>\n\n\n\n<p>Fazer a leitura do XML e utilizar as classes do System.XML funcionam e muito bem, mas existem uma verbosidade ao extrair todos os dados do XML e converter para um Objeto. Por isso, vamos utilizar o XMLSerializer do pr\u00f3prio .NET Full Framework que funciona no Core e l\u00f3gico que no 5 e 6 e por ai vai. Olha que lindo, ele usa o pacote System.Xml.Serialize.<\/p>\n\n\n\n<p>Nesse artigo, vou mostrar exemplo para listagem com um mestre e detalhe do tradicional pedido, pois ele consegue converter o XML em v\u00e1rios n\u00edveis de objetos relacionados.&nbsp;<\/p>\n\n\n\n<p>Para isso, vamos utilizar o XML:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;pedido&gt;\n    &lt;numero&gt;101010&lt;\/numero&gt;\n    &lt;data&gt;2019-05-30T16:05:00&lt;\/data&gt;\n    &lt;cliente&gt;Joao da Silva&lt;\/cliente&gt;\n    &lt;itens&gt;\n        &lt;item&gt;\n            &lt;id&gt;1&lt;\/id&gt;\n            &lt;produto&gt; Mustang GT&lt;\/produto&gt;\n            &lt;quantidade&gt;2&lt;\/quantidade&gt;\n        &lt;\/item&gt;\n        &lt;item&gt;\n            &lt;id&gt;2&lt;\/id&gt;\n            &lt;produto&gt;Corsa Wind&lt;\/produto&gt;\n            &lt;quantidade&gt;20&lt;\/quantidade&gt;\n        &lt;\/item&gt;\n        &lt;item&gt;\n            &lt;id&gt;3&lt;\/id&gt;\n            &lt;produto&gt;Macbook Pro Apple&lt;\/produto&gt;\n            &lt;quantidade&gt;1&lt;\/quantidade&gt;\n        &lt;\/item&gt;\n        &lt;item&gt;\n            &lt;id&gt;4&lt;\/id&gt;\n            &lt;produto&gt;Agua Mineral&lt;\/produto&gt;\n            &lt;quantidade&gt;3&lt;\/quantidade&gt;\n        &lt;\/item&gt;\n    &lt;\/itens&gt;\n&lt;\/pedido&gt;<\/pre>\n\n\n\n<p>Veja que \u00e9 uma estrutura simples de pedidos e seus itens.<br>O objeto e composto por uma classe de pedidos e uma classe de pedido itens.&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[XmlRoot(ElementName = \"pedido\")]\npublic class Pedido\n{\n    [XmlElement(ElementName = \"numero\")]\n    public int Numero { get; set; }\n\n    [XmlElement(ElementName = \"data\")]\n    public DateTime Data { get; set; }\n\n    [XmlElement(ElementName = \"cliente\")]\n    public string Cliente { get; set; }\n\n    [XmlArray(\"itens\")]\n    public List&lt;PedidoItens&gt; Itens { get; set; }\n}\n\n[XmlType(\"item\")]\npublic class PedidoItens\n{\n    [XmlElement(ElementName = \"id\")]\n    public int ProdutoID { get; set; }\n\n    [XmlElement(ElementName = \"produto\")]\n    public string Produto { get; set; }\n\n    [XmlElement(ElementName = \"quantidade\")]\n    public int Quantidade { get; set; }\n}\n<\/pre>\n\n\n\n<p>Note que a classe est\u00e1 com as tags XmlRoot, XmlType, XmlElement e XmlArray. Precisamos informa &#8211; las para que o Serializer encontre as propriedades que devem ser setadas.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>XmlRoot<\/td><td>Indica classe raiz do objeto. Ou seja a tag de abertura do XML &lt;pedido&gt;<\/td><\/tr><tr><td>XmlElement<\/td><td>Indica os elementos da classe ap\u00f3s o root, como &lt;numero&gt; e &lt;data&gt;<\/td><\/tr><tr><td>XmlArray<\/td><td>Indica os elementos que se repetir\u00e3o na lista de &lt;itens&gt;, mas veja que existe um elemento&nbsp;<strong>Itens<\/strong>&nbsp;e o elemento&nbsp;<strong>item.<\/strong><\/td><\/tr><tr><td>XmlType<\/td><td>Indica o subtipo de root. Geralmente quando se tem classes relacionadas essa vai ser a Tag utilizada como &lt;item&gt;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Para popular o objeto vamos utilizar um Stream com o objeto FileStream. Veja:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">var fileStream = new FileStream(@\".\/XML\/pedido_tipo_1.xml\", FileMode.Open);\nvar xmlSerializer = new XmlSerializer(typeof(Pedido));\nvar pedido = xmlSerializer.Deserialize(fileStream);\n<\/pre>\n\n\n\n<p>Veja que na primeira linha temos a leitura do XML em Stream. No caso, passamos o caminho do XML ao FileStream.<br>Na segunda linha instanciamos o XmlSerializer com o tipo de retorno esperado.<br>E por \u00faltimo recuperamos descerializamos o XML para o Objeto pedido.<\/p>\n\n\n\n<p>E assim a m\u00e1gica acontece de forma bem simples e pr\u00e1tica. N\u00e3o precisamos montar aquela estrutura complexa de nodes e mais nodes.&nbsp;<\/p>\n\n\n\n<p>Artigo curto e espero que ajude com leituras XML.&nbsp;<\/p>\n\n\n\n<p>Duvidas?? Deixem os coment\u00e1rios ai abaixo que respondo r\u00e1pido.&nbsp;<\/p>\n\n\n\n<p>Os fontes se encontram no meu&nbsp;<a href=\"https:\/\/github.com\/danilodumba\/ConvertXmlToObject\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>&nbsp;e bora codar.&nbsp;<\/p>\n\n\n\n<p><strong>Links uteis.<\/strong>&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/docs.microsoft.com\/pt-br\/dotnet\/api\/system.xml.serialization.xmlserializer.deserialize?view=net-6.0\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 povo! Nesses \u00faltimos dias estava trabalhando em um projeto legado e precisei dar manuten\u00e7\u00e3o em uma estrutura para leitura de XML, convert\u00ea-los em objetos de dom\u00ednio e utilizar os dados no projeto, por\u00e9m me deparei com leituras de XML com o XmlElement e suas subclasses. Mas eles funcionam? Claro que Sim, mas existe uma [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":68,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,12],"tags":[],"class_list":["post-67","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-dicas"],"_links":{"self":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts\/67","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/comments?post=67"}],"version-history":[{"count":1,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":69,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions\/69"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/media\/68"}],"wp:attachment":[{"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/media?parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/categories?post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dumba.dev.br\/index.php\/wp-json\/wp\/v2\/tags?post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}