XML APPEND
Pessoal estou tentando passar um parâmetro para a ultima linha de um xml, mas não sei se está certo a maneira que estou implementando o código.
Posto aqui pois no meu código ele não da erro porem ele não faz nada nem da o Append.lastchip no xml.
wBracakOBAMA.InnerXml = @[Ô]<protNFe versao= [Ô] + [Ô]3.10[Ô] + [Ô]><infProt Id= [Ô] + lN.infProt.Id + [Ô]><tpAmb>[Ô] + lN.infProt.tpAmb + [Ô]</tpAmb><verAplic>[Ô] + lN.infProt.verAplic + [Ô]</verAplic><chNFe>[Ô] + lN.infProt.chNFe + [Ô] < /chNFe><dhRecbto> [Ô] + lN.infProt.dhRecbto + [Ô]</dhRecbto><nProt>[Ô] + lN.infProt.nProt + [Ô]</nProt><digVal>[Ô] + lN.infProt.digVal + [Ô]</digVal><cStat>[Ô] + lN.infProt.cStat + [Ô]</cStat><xMotivo>[Ô] + lN.infProt.xMotivo + [Ô]</xMotivo></infProt></protNFe></nfeProc>[Ô];
E para jogar na ultima linha pulando todas que já existe no xml.
Posto aqui pois no meu código ele não da erro porem ele não faz nada nem da o Append.lastchip no xml.
wBracakOBAMA.InnerXml = @[Ô]<protNFe versao= [Ô] + [Ô]3.10[Ô] + [Ô]><infProt Id= [Ô] + lN.infProt.Id + [Ô]><tpAmb>[Ô] + lN.infProt.tpAmb + [Ô]</tpAmb><verAplic>[Ô] + lN.infProt.verAplic + [Ô]</verAplic><chNFe>[Ô] + lN.infProt.chNFe + [Ô] < /chNFe><dhRecbto> [Ô] + lN.infProt.dhRecbto + [Ô]</dhRecbto><nProt>[Ô] + lN.infProt.nProt + [Ô]</nProt><digVal>[Ô] + lN.infProt.digVal + [Ô]</digVal><cStat>[Ô] + lN.infProt.cStat + [Ô]</cStat><xMotivo>[Ô] + lN.infProt.xMotivo + [Ô]</xMotivo></infProt></protNFe></nfeProc>[Ô];
E para jogar na ultima linha pulando todas que já existe no xml.
Não é assim que se trabalha com XML... Você deve usar serialização e desserialização. Existem vários exemplos sobre isso aqui no VBMania mesmo.
Ok vou ler sobre o assunto pois não achei aqui nenhum exemplo com o nome serialização e desserialização.
Obrigado
Obrigado
Existem vários jeitos de trabalhar com Xml.
Como o Kerplunk falou, uma das formas é serializando/deserializando.
Outra forma é usando o objeto XmlWriter, XmlDocument...
Como eu tive que emitir NFSe para muitos municÃpios, eu usei o conceito de mapeamento-objeto relacional para xml. Basicamente, usei Reflection pra poder configurar todo o meu xml através de classes. Ficou extremamente produtivo, coisa de criar todos os xmls (envio, cancelamento, consulta) em 1 dia. Talvez você opte por essa forma também.
Abraços!
Como o Kerplunk falou, uma das formas é serializando/deserializando.
Outra forma é usando o objeto XmlWriter, XmlDocument...
Como eu tive que emitir NFSe para muitos municÃpios, eu usei o conceito de mapeamento-objeto relacional para xml. Basicamente, usei Reflection pra poder configurar todo o meu xml através de classes. Ficou extremamente produtivo, coisa de criar todos os xmls (envio, cancelamento, consulta) em 1 dia. Talvez você opte por essa forma também.
Abraços!
Existe uma ferramenta que transforma um XML pronto em classes, ela é parte do visual studio e se chama XSD. Com as classes prontas, você simplesmente serializa e desserializa XML para classes e vice-versa
Bacana, não conhecia.
Aà se eu quiser, por exemplo, um elemento condicional usando esse método. (A tag <nome> só irá aparecer caso <codigo> = 999). Dei uma pesquisada aqui e não encontrei como seria. Modificando o xsd ficaria automático isso?
Aà se eu quiser, por exemplo, um elemento condicional usando esse método. (A tag <nome> só irá aparecer caso <codigo> = 999). Dei uma pesquisada aqui e não encontrei como seria. Modificando o xsd ficaria automático isso?
Neste caso, eu uso o padrão [Ô]ShouldSerialize[Ô]:
No exemplo acima, apesar da propriedade descrição conter um valor, nada será serializado, visto que a condição é que [Ô]Codigo[Ô] contenha algum valor. Tenho alguns casos aqui que tem várias validações para uma só propriedade.
class Program
{
static void Main(string[] args)
{
Book livro = new Book();
livro.Descricao = [Ô]xxx[Ô];
XmlSerializer ser = new XmlSerializer(typeof(Book));
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, livro);
ms.Position = 0;
StreamReader r = new StreamReader(ms);
string res = r.ReadToEnd();
}
}
public class Book
{
public Int32? Codigo { get; set; }
public bool ShouldSerializeCodigo()
{
return Codigo.HasValue;
}
public string Descricao { get; set; }
public bool ShouldSerializeDescricao()
{
return Codigo.HasValue;
}
}
No exemplo acima, apesar da propriedade descrição conter um valor, nada será serializado, visto que a condição é que [Ô]Codigo[Ô] contenha algum valor. Tenho alguns casos aqui que tem várias validações para uma só propriedade.
IncrÃvel.
Com certeza essa é uma ótima alternativa que me atenderia plenamente.
Valeu!
Com certeza essa é uma ótima alternativa que me atenderia plenamente.
Valeu!
XML é algo bastante complexo, mas é dados e não deve nunca ser tratado como texto. Apesar de ser possÃvel, não é o ideal. Existe também a possibilidade de colar um XML ou JSON válido diretamente como classe. Basta copiar o XML ou JSON, criar uma classe nova e ir no menu Edit -> Paste Special e escolher a opção que corresponder. Ela cria inclusive para múltiplas classes, por exemplo caso haja um tipo que é uma classe, esta será criada também.
Ok consegui resolver da forma abaixo sei que pode não ser a forma mais elegante ou correta de se aplicar neste caso.
//************************************************************************
// Aqui monto um arquivo xml com a tag nfeproc e o xml que tem o nfe e assinatura
XElement xFileRoot = XElement.Load(@[Ô]xml\\XMLComTagnfeProc.xml[Ô]);
XElement xFileChild = XElement.Load(@[Ô]xml\\xmlSenEnviNFe.xml[Ô]);
xFileRoot.Add(xFileChild);
xFileRoot.Save(@[Ô]xml\\XmSemRetorno.xml[Ô]);
//**************************************************************************
E depois fiz assim para complementar o XML e deixar ele válido, para o que eu precisava.
aWdoc.Load(@[Ô]Xml\\XmLAssinadoSemRetorno.xml[Ô]);
XmlDocumentFragment Wdoc = aWdoc.CreateDocumentFragment();
Wdoc.InnerXml = [Ô]<protNFe versao=\[Ô]3.10\[Ô]>
[Ô] +
[Ô]<infProt Id=\[Ô][Ô] + lN.infProt.Id + [Ô] \[Ô]>
[Ô] +
[Ô]<tpAmb>[Ô] + lN.infProt.tpAmb + [Ô]</tpAmb>
[Ô] +
[Ô]<verAplic>[Ô] + lN.infProt.verAplic + [Ô]</verAplic>
[Ô] +
[Ô]</infProt>
[Ô] +
[Ô]</protNFe>[Ô];
aWdoc.DocumentElement.AppendChild(Wdoc);
Desculpa pessoal, se ficou ruim o código mas funcionou, estou aprendendo o C# e a usar a IDE VS2013 então está osso viu, olha só são poucas linhas e eu demorei quase 3 dias para desenrolar isso, peço que continuem colaborando quando preciso pois com minhas dúvidas vamos enriquecer ainda mais o material aqui disponÃvel.
Agradeço a Todos e KERPLUNK, vou fazer um projeto modelo com a ferramenta XSD para ver como funciona e obrigado pela dica.
//************************************************************************
// Aqui monto um arquivo xml com a tag nfeproc e o xml que tem o nfe e assinatura
XElement xFileRoot = XElement.Load(@[Ô]xml\\XMLComTagnfeProc.xml[Ô]);
XElement xFileChild = XElement.Load(@[Ô]xml\\xmlSenEnviNFe.xml[Ô]);
xFileRoot.Add(xFileChild);
xFileRoot.Save(@[Ô]xml\\XmSemRetorno.xml[Ô]);
//**************************************************************************
E depois fiz assim para complementar o XML e deixar ele válido, para o que eu precisava.
aWdoc.Load(@[Ô]Xml\\XmLAssinadoSemRetorno.xml[Ô]);
XmlDocumentFragment Wdoc = aWdoc.CreateDocumentFragment();
Wdoc.InnerXml = [Ô]<protNFe versao=\[Ô]3.10\[Ô]>
[Ô] +
[Ô]<infProt Id=\[Ô][Ô] + lN.infProt.Id + [Ô] \[Ô]>
[Ô] +
[Ô]<tpAmb>[Ô] + lN.infProt.tpAmb + [Ô]</tpAmb>
[Ô] +
[Ô]<verAplic>[Ô] + lN.infProt.verAplic + [Ô]</verAplic>
[Ô] +
[Ô]</infProt>
[Ô] +
[Ô]</protNFe>[Ô];
aWdoc.DocumentElement.AppendChild(Wdoc);
Desculpa pessoal, se ficou ruim o código mas funcionou, estou aprendendo o C# e a usar a IDE VS2013 então está osso viu, olha só são poucas linhas e eu demorei quase 3 dias para desenrolar isso, peço que continuem colaborando quando preciso pois com minhas dúvidas vamos enriquecer ainda mais o material aqui disponÃvel.
Agradeço a Todos e KERPLUNK, vou fazer um projeto modelo com a ferramenta XSD para ver como funciona e obrigado pela dica.
Tópico encerrado , respostas não são mais permitidas