XML APPEND

NETVOO 26/11/2015 22:17:37
#454445
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.
KERPLUNK 26/11/2015 22:44:55
#454446
Resposta escolhida
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.
NETVOO 26/11/2015 23:13:39
#454447
Ok vou ler sobre o assunto pois não achei aqui nenhum exemplo com o nome serialização e desserialização.
Obrigado
DS2T 27/11/2015 00:36:10
#454449
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!

KERPLUNK 27/11/2015 05:54:47
#454451
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
DS2T 27/11/2015 14:36:26
#454494
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?
KERPLUNK 27/11/2015 15:16:25
#454500
Neste caso, eu uso o padrão [Ô]ShouldSerialize[Ô]:

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.
DS2T 27/11/2015 15:37:51
#454506
Incrível.
Com certeza essa é uma ótima alternativa que me atenderia plenamente.

Valeu!
KERPLUNK 27/11/2015 15:50:19
#454508
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.
NETVOO 29/11/2015 18:43:21
#454570
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.
Tópico encerrado , respostas não são mais permitidas