Recuperando Dados do XML

20 respostas
programação
San_n

Estou com a seguinte questão…

Estou fazendo a leitura de um Xml, e para pegar os valores dos nós eu uso …

public class Produto {

    [XmlElement("PRODUTO")]
    public string produto; 

}

Gostaria de uma forma de introduzir o nome do elemento “PRODUTO” de uma forma dinâmica, ou seja, pudesse mudar o nome do elemento.

  • Exemplo:
string parametro = "produto";
XmlElement("parametro")]
public string produto;

Obs: Lembrando que a string produto vai receber o valor que for recuperado do elemento do XML.

Não sei se deu pra entender, mas espere que sim.

20 Respostas

Dragoon

Passa o XML

San_n
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe35080599999090910270550010000000015180051273" versao="1.10">
<ide>
<cUF>35</cUF>
<cNF>518005127</cNF>
<natOp>Venda a vista</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>1</serie>
<nNF>1</nNF>
<dEmi>2008-05-06</dEmi>
<dSaiEnt>2008-05-06</dSaiEnt>
<tpNF>0</tpNF>
<cMunFG>3550308</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>NF-eletronica.com</verProc>
</ide>
<emit>
<CNPJ>99999090910270</CNPJ>
<xNome>NF-e Associacao NF-e</xNome>
<xFant>NF-e</xFant>
<enderEmit>
<xLgr>Rua Central</xLgr>
<nro>100</nro>
<xCpl>Fundos</xCpl>
<xBairro>Distrito Industrial</xBairro>
<cMun>3502200</cMun>
<xMun>Angatuba</xMun>
<UF>SP</UF>
<CEP>17100171</CEP>
<cPais>1058</cPais>
<xPais>Brasil</xPais>
<fone>[telefone removido]</fone>
</enderEmit>
<IE>123456789012</IE>
</emit>
<dest>
<CNPJ>00000000000191</CNPJ>
<xNome>DISTRIBUIDORA DE AGUAS MINERAIS</xNome>
<enderDest>
<xLgr>AV DAS FONTES</xLgr>
<nro>1777</nro>
<xCpl>10 ANDAR</xCpl>
<xBairro>PARQUE FONTES</xBairro>
<cMun>5030801</cMun>
<xMun>Sao Paulo</xMun>
<UF>SP</UF>
<CEP>13950000</CEP>
<cPais>1058</cPais>
<xPais>BRASIL</xPais>
<fone>[telefone removido]</fone>
</enderDest>
<IE> </IE>
</dest>
<retirada>
<CNPJ>99171171000194</CNPJ>
<xLgr>AV PAULISTA</xLgr>
<nro>12345</nro>
<xCpl>TERREO</xCpl>
<xBairro>CERQUEIRA CESAR</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</retirada>
<entrega>
<CNPJ>99299299000194</CNPJ>
<xLgr>AV FARIA LIMA</xLgr>
<nro>1500</nro>
<xCpl>15 ANDAR</xCpl>
<xBairro>PINHEIROS</xBairro>
<cMun>3550308</cMun>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</entrega>
<det nItem="1">
<prod>
<cProd>00001</cProd>
<cEAN></cEAN>
<xProd>Agua Mineral</xProd>
<CFOP>5101</CFOP>
<uCom>dz</uCom>
<qCom>1000000.0000</qCom>
<vUnCom>1</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib></cEANTrib>
<uTrib>und</uTrib>
<qTrib>12000000.0000</qTrib>
<vUnTrib>1</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<det nItem="2">
<prod>
<cProd>00002</cProd>
<cEAN></cEAN>
<xProd>Agua Mineral</xProd>
<CFOP>5101</CFOP>
<uCom>pack</uCom>
<qCom>5000000.0000</qCom>
<vUnCom>2</vUnCom>
<vProd>10000000.00</vProd>
<cEANTrib></cEANTrib>
<uTrib>und</uTrib>
<qTrib>3000000.0000</qTrib>
<vUnTrib>0.3333</vUnTrib>
</prod>
<imposto>
<ICMS>
<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>0</modBC>
<vBC>10000000.00</vBC>
<pICMS>18.00</pICMS>
<vICMS>1800000.00</vICMS>
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pPIS>0.65</pPIS>
<vPIS>65000</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>01</CST>
<vBC>10000000.00</vBC>
<pCOFINS>2.00</pCOFINS>
<vCOFINS>200000.00</vCOFINS>
</COFINSAliq>
</COFINS>
</imposto>
</det>
<total>
<ICMSTot>
<vBC>20000000.00</vBC>
<vICMS>18.00</vICMS>
<vBCST>0</vBCST>
<vST>0</vST>
<vProd>20000000.00</vProd>
<vFrete>0</vFrete>
<vSeg>0</vSeg>
<vDesc>0</vDesc>
<vII>0</vII>
<vIPI>0</vIPI>
<vPIS>130000.00</vPIS>
<vCOFINS>400000.00</vCOFINS>
<vOutro>0</vOutro>
<vNF>20000000.00</vNF>
</ICMSTot>
</total>
<transp>
<modFrete>0</modFrete>
<transporta>
<CNPJ>99171171000191</CNPJ>
<xNome>Distribuidora de Bebidas Fazenda de SP Ltda.</xNome>
<IE>171999999119</IE>
<xEnder>Rua Central 100 - Fundos - Distrito Industrial</xEnder>
<xMun>SAO PAULO</xMun>
<UF>SP</UF>
</transporta>
<veicTransp>
<placa>BXI1717</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</veicTransp>
<reboque>
<placa>BXI1818</placa>
<UF>SP</UF>
<RNTC>123456789</RNTC>
</reboque>
<vol>
<qVol>10000</qVol>
<esp>CAIXA</esp>
<marca>LINDOYA</marca>
<nVol>500</nVol>
<pesoL>[telefone removido].000</pesoL>
<pesoB>[telefone removido].000</pesoB>
<lacres>
<nLacre>XYZ10231486</nLacre>
</lacres>
</vol>
</transp>
<infAdic>
<infAdFisco>Nota Fiscal de exemplo NF-eletronica.com</infAdFisco>
</infAdic>
</infNFe>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod>
<Reference URI="#NFe35080599999090910270550010000000015180051273">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
<DigestValue>xhTSDMH61e9uqe04lnoHT4ZzLSY=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Iz5Z3PLQbzZt9jnBtr6xsmHZMOu/3plXG9xxfFjRCQYGnD1rjlhzBGrqt026Ca2VHHM/bHNepi6FuFkAi595GScKVuHREUotzifE2OIjgavvTOrMwbXG7+0LYgkwPFiPCao2S33UpZe7MneaxcmKQGKQZw1fP8fsWmaQ4cczZT8=</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIEuzCCA6OgAwIBAgIDMTMxMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYDVQQGEwJCUjELMAkGA1UECBMCUlMxFTATBgNVBAcTDFBvcnRvIEFsZWdyZTEdMBsGA1UEChMUVGVzdGUgUHJvamV0byBORmUgUlMxHTAbBgNVBAsTFFRlc3RlIFByb2pldG8gTkZlIFJTMSEwHwYDVQQDExhORmUgLSBBQyBJbnRlcm1lZGlhcmlhIDEwHhcNMDgwNDI4MDkwMTAyWhcNMDkwNDMwMjM1OTU5WjCBnjELMAkGA1UECBMCUlMxHTAbBgNVBAsTFFRlc3RlIFByb2pldG8gTkZlIFJTMR0wGwYDVQQKExRUZXN0ZSBQcm9qZXRvIE5GZSBSUzEVMBMGA1UEBxMMUE9SVE8gQUxFR1JFMQswCQYDVQQGEwJCUjEtMCsGA1UEAxMkTkZlIC0gQXNzb2NpYWNhbyBORi1lOjk5OTk5MDkwOTEwMjcwMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDh6RRv0bj4RYX+tDQrZRb5opa77LBVVs+6LphIfSF3TSWPfnKh0+xLlBFdmnB5YGgbbW9Uon6pZQTfaC8jZhRhI5eFRRofY/Ugoeo0NGt6PcIQNZQd6lLQ/ASd1qWwjqJoEa7udriKjy3h351Mf1bng1VxS1urqC3Dn39ZWIEwQIDAQABo4IBjjCCAYowIgYDVR0jAQEABBgwFoAUPT5TqhNWAm+ZpcVsvB7malDBjEQwDwYDVR0TAQH/BAUwAwEBADAPBgNVHQ8BAf8EBQMDAOAAMAwGA1UdIAEBAAQCMAAwgbwGA1UdEQEBAASBsTCBrqA4BgVgTAEDBKAvBC0wNzA4MTk1MTE1MTk0NTMxMDg3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDCgHQYFYEwBAwKgFAQSRmVybmFuZG8gQ2FudG8gQWx0oBkGBWBMAQMDoBAEDjk5OTk5MDkwOTEwMjcwoBcGBWBMAQMHoA4EDDAwMDAwMDAwMDAwMIEfZmVybmFuZG8tYWx0QHByb2NlcmdzLnJzLmdvdi5icjAgBgNVHSUBAf8EFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwUwYDVR0fAQEABEkwRzBFoEOgQYY/aHR0cDovL25mZWNlcnRpZmljYWRvLnNlZmF6LnJzLmdvdi5ici9MQ1IvQUNJbnRlcm1lZGlhcmlhMzguY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCNPpaZ3Byu3/70nObXE8NiM53j1ddIFXsb+v2ghCVd4ffExv3hYc+/a3lfgV8H/WfQsdSCTzS2cHrd4Aasr/eXfclVDmf2hcWz+R7iysOHuT6B6r+DvV3JcMdJJCDdynR5REa+zViMnVZo1G3KuceQ7/y5X3WFNVq4kwHvonJ9oExsWyw8rTwUK5bsjz0A2yEwXkmkJIngnF41sP31+9jCImiqkXcmsesFhxzX7iurAQAQCZOm7iwMWxQKcAjXCZrgSZWRQy6mU224sX3HTArHahmLJ9Iw+WYAua5qBJsiN6PC7v5tfhrEQFpcG39yMnOecxvkkPolDUyBa7d7xwgm</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</NFe>
San_n

No exemplo eu coloquei Produto, mas a TAG que eu realmente quero poder alterar é a tag filha que está dentro da TAG que está dentro da TAG

Dragoon

Você não pode ter nada dinâmico nesse caso, você precisa saber qual é o nome da TAG e configurar o seu modelo!

Entendeu.

San_n

Mas o problema é bem sempre o nome da TAG é o mesmo, por isso eu queria ter uma saída para realizar essa substituição. Pq caso contrário eu só imagino ter q criar várias classes iguais apenas com nomes de tags diferentes que possam vir.
Não queria fazer isso pq fica muito feio, ptipo gambiarra.

Dragoon

Não estou entendendo?

Esse XML não vem sempre assim?

San_n

Não, os códigos de ICMS mudam.
Então de acordo com o código que vier o nome da TAG vai mudar.
Pode vir ICMS00, ICMS10, ICMS20, … e por aí vai.

Dragoon

O seu problema é o seguinte, querer condensar um rotina que não dá!

Você precisa verificar quais são os tipos e montar um classe base e sua heranças e ai resolver os eu problema!

Se você tiver vários, vai ter vários modelos, só precisa tomar cuidado com repetição

Quais são os modelos?

San_n
public class Imposto_ICMS
{

    [XmlElement("ICMS00")]
    public InnerImpostoICMS innerImpostoICMS;
    
    public class InnerImpostoICMS
    {
        public int orig     { get; set; }
        public int CST      { get; set; }
        public int modBC    { get; set; }
        public double vBC   { get; set; }
        public double pICMS { get; set; }
        public double vICMS { get; set; }   
    }
}
San_n

São 33 códigos de ICMS diferentes, seriam 33 classes

darlan_machado

Dá uma olhada e vê se te atende.
Uma alternativa é tentar ler as tags e os respectivos conteúdos inserindo os mesmos em mapas, talvez facilitasse a questão da leitura.
Porém, você teria que iterar sobre o documento e, então, ir lendo tag por tag. Isso poderia ocasionar lentidão.

Dragoon

@San_n precisa ver as 33 XML e montar uma estrutura aonde os dados possam ser compartilhados.

Pergunto a sua linguagem é C#?

Se não for possivel, se são 33 XML diferentes onde as suas estruturas são diferentes, onde o decorador muda a configuração, vai precisar ser 33 classes diferentes.

  • Você tem idéia e já verificou todos os layouts de classes?
  • Você já fez comparação em campos que se repetem?
  • Tem algum tutorial/documentação dessas estruturas XML?
Dragoon

Pela classe que ela colocou no corpo de resposta é C# a linguagem.

San_n

Não são 33 XML, são 33 códigos de ICMS diferentes que podem vir aleatórios em um XML.
E como recupero o valor da TAG pelo nome, se coloco e no documento tem o programa vai dá erro.

Dragoon

Cite no minimo 2 exemplos, talvez consiga entender a sua duvida, Tag diferentes ficou vago nesse aspecto, eu sei como funciona esses XML mas, no seu caso não ficou claro

San_n
* <det nItem="1">
  * <prod>
    * <cProd>00001</cProd>
    * <cEAN></cEAN>
    * <xProd>Agua Mineral</xProd>
    * <CFOP>5101</CFOP>
    * <uCom>dz</uCom>
    * <qCom>1000000.0000</qCom>
    * <vUnCom>1</vUnCom>
    * <vProd>10000000.00</vProd>
    * <cEANTrib></cEANTrib>
    * <uTrib>und</uTrib>
    * <qTrib>12000000.0000</qTrib>
    * <vUnTrib>1</vUnTrib></prod>
  * <imposto>
    * <ICMS>
      * <ICMS00>
        * <orig>0</orig>
        * <CST>00</CST>
        * <modBC>0</modBC>
        * <vBC>10000000.00</vBC>
        * <pICMS>18.00</pICMS>
        * <vICMS>1800000.00</vICMS></ICMS00></ICMS>
    * <PIS>
      * <PISAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pPIS>0.65</pPIS>
        * <vPIS>65000</vPIS></PISAliq></PIS>
    * <COFINS>
      * <COFINSAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pCOFINS>2.00</pCOFINS>
        * <vCOFINS>200000.00</vCOFINS></COFINSAliq></COFINS></imposto></det>

* <det nItem="2">
  * <prod>
    * <cProd>00002</cProd>
    * <cEAN></cEAN>
    * <xProd>Agua Mineral</xProd>
    * <CFOP>5101</CFOP>
    * <uCom>pack</uCom>
    * <qCom>5000000.0000</qCom>
    * <vUnCom>2</vUnCom>
    * <vProd>10000000.00</vProd>
    * <cEANTrib></cEANTrib>
    * <uTrib>und</uTrib>
    * <qTrib>3000000.0000</qTrib>
    * <vUnTrib>0.3333</vUnTrib></prod>
  * <imposto>
    * <ICMS>
      * <ICMS00>
        * <orig>0</orig>
        * <CST>00</CST>
        * <modBC>0</modBC>
        * <vBC>10000000.00</vBC>
        * <pICMS>18.00</pICMS>
        * <vICMS>1800000.00</vICMS></ICMS00></ICMS>
    * <PIS>
      * <PISAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pPIS>0.65</pPIS>
        * <vPIS>65000</vPIS></PISAliq></PIS>
    * <COFINS>
      * <COFINSAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pCOFINS>2.00</pCOFINS>
        * <vCOFINS>200000.00</vCOFINS></COFINSAliq></COFINS></imposto></det>
San_n
* <det nItem="1">
  * <prod>
    * <cProd>00001</cProd>
    * <cEAN></cEAN>
    * <xProd>Agua Mineral</xProd>
    * <CFOP>5101</CFOP>
    * <uCom>dz</uCom>
    * <qCom>1000000.0000</qCom>
    * <vUnCom>1</vUnCom>
    * <vProd>10000000.00</vProd>
    * <cEANTrib></cEANTrib>
    * <uTrib>und</uTrib>
    * <qTrib>12000000.0000</qTrib>
    * <vUnTrib>1</vUnTrib></prod>
  * <imposto>
    * <ICMS>
      * <ICMS60>
        * <orig>0</orig>
        * <CST>00</CST>
        * <modBC>0</modBC>
        * <vBC>10000000.00</vBC>
        * <pICMS>18.00</pICMS>
        * <vICMS>1800000.00</vICMS></ICMS00></ICMS>
    * <PIS>
      * <PISAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pPIS>0.65</pPIS>
        * <vPIS>65000</vPIS></PISAliq></PIS>
    * <COFINS>
      * <COFINSAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pCOFINS>2.00</pCOFINS>
        * <vCOFINS>200000.00</vCOFINS></COFINSAliq></COFINS></imposto></det>

* <det nItem="2">
  * <prod>
    * <cProd>00002</cProd>
    * <cEAN></cEAN>
    * <xProd>Agua Mineral</xProd>
    * <CFOP>5101</CFOP>
    * <uCom>pack</uCom>
    * <qCom>5000000.0000</qCom>
    * <vUnCom>2</vUnCom>
    * <vProd>10000000.00</vProd>
    * <cEANTrib></cEANTrib>
    * <uTrib>und</uTrib>
    * <qTrib>3000000.0000</qTrib>
    * <vUnTrib>0.3333</vUnTrib></prod>
  * <imposto>
    * <ICMS>
      * <ICMS60>
        * <orig>0</orig>
        * <CST>00</CST>
        * <modBC>0</modBC>
        * <vBC>10000000.00</vBC>
        * <pICMS>18.00</pICMS>
        * <vICMS>1800000.00</vICMS></ICMS00></ICMS>
    * <PIS>
      * <PISAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pPIS>0.65</pPIS>
        * <vPIS>65000</vPIS></PISAliq></PIS>
    * <COFINS>
      * <COFINSAliq>
        * <CST>01</CST>
        * <vBC>10000000.00</vBC>
        * <pCOFINS>2.00</pCOFINS>
        * <vCOFINS>200000.00</vCOFINS></COFINSAliq></COFINS></imposto></det>
San_n

Perceba que existem duas Tags com nome e cada uma corresponde a um item em um pedido da nota fiscal, dentro de cada uma eu tenho a tags <prod> que contem as informações relacionadas ao produto.

Dentro das tags <det nItem="1"> e <det nItem="2"> existe a tag <imposto> dentro de imposto tem a tag que contem os dados de impostos por produto.

Dentro da tag <ICMS> eu tenho outras tags referentes só a impostos de icms por produto. E é ai que eu tenho a tal “Tag diferente”, pois dentro da tag mãe eu terei uma outra tag que pode variar o nome, no codigo eu tenho a tag , porém cada nota pode vir com um icms diferente, e ai no caso se na minha aplicação eu determinar que meu [XmlElement("ICMS00")] vai recuperar os dados dessa tag e no documento vier [XmlElement("ICMS60")] a minha aplicação vai falhar.

Dragoon

Não tem como você fazer um código dinâmico na hora de configurar por meio de atributo o novo valor, não é assim que funciona, você precisa fazer de outra forma isso ai, o grande mau desse XML é que eles nunca pensa no desenvolvedor.

Talvez fazer um novo código para ler esses dados … acho que o caminho é por ai.

San_n

Pois é cara, ta foda! :sweat:

Criado 5 de maio de 2019
Ultima resposta 7 de mai. de 2019
Respostas 20
Participantes 3