13 de maio de 2009

Trabalhando com XML - parte 3

Quando fiz o post sobre criar um XML usando C#, ficou faltando mostrar a parte de como criar o cabeçalho do XML dentro da estrutura do DOM. Vou mostrar isso neste post e, para tanto, volto a reproduzir o mesmo XML dos outros dois posts sobre o assunto e vou usá-lo como exemplo :
<?xml version="1.0" encoding="UTF-8" ?>
<enviNFe versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<idLote>71</idLote>
<NFe>
<infNFe Id="NFe3508059978"versao="1.10">
<cUF>35</cUF>
<cNF>518005127</cNF>
<natOp>Venda a vista</natOp>
<mod>55</mod>
<serie>1</serie>
<dEmi>2008-05-06</dEmi>
<tpAmb>2</tpAmb>
</infNFe>
</NFe>
</enviNFe>

Há uma classe no namespace System.Xml do framework do .Net responsável pela criação do cabeçalho do XML. O nome dessa classe é XmlDeclaration. Considerando a variável doc do tipo XmlDocument criada no post anterior sobre XML, a inclusão do cabeçalho deve ser feita como no exemplo abaixo :
XmlDeclaration decl;
decl = doc.CreateXmlDeclaration("1.0", System.Text.Encoding.UTF8.HeaderName, "");
doc.InsertBefore(decl, doc.DocumentElement);

Os parâmetros para a função CreateXmlDeclaration são a versão do XML (normalmente, o valor "1.0"), em seguida o tipo de codificação a ser utilizado (no exemplo, obtive o nome do encoding UTF-8 definido pelo próprio framework) e, por fim, o valor para o atributo standalone. Como no nosso XML exemplo o standalone não aparece, passei um texto vazio, instruindo a criação do cabeçalho sem essa informação.

A última linha do código faz com que a declaração de cabeçalho seja acrescentada na estrutura DOM do XML imediamente antes do nó raiz. O nó raiz é aqui representado pela propriedade DocumentElement da variável doc (que é um XmlElement).

Nos próximos posts, mostro como exportar essa estrutura DOM para o formato texto de forma que possa ser usado para gravar um arquivo com o conteúdo XML; devo falar também sobre a navegação pelos nós de um XML dentro do DOM e, finalmente, como assinar o XML para enviá-lo à Receita Federal.

11 de maio de 2009

Trabalhando com XML - parte 2

Como eu havia informado no post anterior sobre XML, vou mostrar aqui como criar um documento XML usando C#. O XML a ser criado será um fragmento do layout exigido pela Receita Federal para o envio de Notas Fiscais Eletrônicas; para facilitar, reproduzo novamente aqui o documento a ser criado :
<?xml version="1.0" encoding="UTF-8" ?>
<enviNFe versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<idLote>71</idLote>
<NFe>
<infNFe Id="NFe3508059978"versao="1.10">
<cUF>35</cUF>
<cNF>518005127</cNF>
<natOp>Venda a vista</natOp>
<mod>55</mod>
<serie>1</serie>
<dEmi>2008-05-06</dEmi>
<tpAmb>2</tpAmb>
</infNFe>
</NFe>
</enviNFe>
Para iniciar, o pacote onde estão as classes para manipulação de XML através de DOM é o System.Xml. Portanto, é preciso informar isso no início do fonte.

using System.Xml;

O documento XML em si é representado por uma instância da classe XmlDocument. Também vamos usar bastante o namespace definido pela Receita Federal para suas estruturas, então, vou declarar uma constante para facilitar. Inclua as linhas abaixo na sua classe :
static string NFeNamespace = "http://www.portalfiscal.inf.br/nfe";
private XmlDocument doc = new XmlDocument();

O primeiro passo na criação é criar o nó raiz. No nosso exemplo, é como segue :
XmlElement raiz, no, noNFe, noInfNFe;
XmlAttribute att;
raiz = doc.CreateElement("enviNFe", NFeNamespace);
// Atributos do nó de enviNFe
att = doc.CreateAttribute("versao");
att.Value = "1.10";
raiz.Attributes.Append(att);

Note que criei manualmente apenas o atributo versao enquanto o xmlns (namespace) é colocado automaticamente pelo parâmetro passado ao CreateElement. Todos os "nós filhos" compartilharão essa informação de namespace.

Vamos criar agora o elemento idLote, que possui um valor associado :
XmlText noText;
no = doc.CreateElement("idLote", NFeNamespace);
noText = doc.CreateTextNode("71");
no.AppendChild(noText);
// "Nó" é filho de raiz :
raiz.AppendChild(no);

Observe que continua imprescindível passar o namespace na criação do nó idLote; se não for informado, subentende-se que um novo namespace (vazio) deve ser usado.

As mesmas regras vistas até agora valem para criar o nó NFe e o nó infNFe e seus filhos:
// infNFE
noInfNFe = doc.CreateElement("infNFe", NFeNamespace);
att = doc.CreateAttribute("Id");
att.Value = "NFe3508059978";
noInfNFe.Attributes.Append(att);

att = doc.CreateAttribute("versao");
att.Value = "1.10";
noInfNFe.Attributes.Append(att);

// Filhos do infNFE
no = doc.CreateElement("cUF", NFeNamespace);
noText = doc.CreateTextNode("35");
no.AppendChild(noText);
noInfNFe.AppendChild(no);

no = doc.CreateElement("cNF", NFeNamespace);
noText = doc.CreateTextNode("518005127");
no.AppendChild(noText);
noInfNFe.AppendChild(no);

// *** Inclua os demais campos aqui ....

// Hierarquia de nós

noNFe = doc.CreateElement("NFe", NFeNamespace);
noNFe.AppendChild(noInfNFe);
raiz.AppendChild(noNFe);

Para finalizar, é preciso ainda informar ao XmlDocument quem é seu nó raiz:
doc.AppendChild (raiz);

Para não me estender muito, publico no próximo post como incluir o cabeçalho para o XML e como transformar a estrutura DOM num texto que possa ser salvo em arquivo ou transmitido como parâmetro num WebService.

9 de maio de 2009

Trabalhando com XML

A Extensible Markup Language - ou simplesmente XML - já é uma tecnologia madura, bastante adotada devido à sua flexibilidade em estruturar dados de uma maneira que permite facilmente intercambiar informações numa ampla gama de situações.

Porquê, então, postar um texto sobre isso se já é uma tecnologia tão amplamente dominada e divulgada ? Primeiro, por que é interessante ter onde encontrar informações básicas, mesmo para aqueles que já usam - de vez em quando dá um branco na gente ! Segundo, eu pretendo postar outros textos envolvendo XML e gostaria de usar neles uma terminologia que fosse bem conhecida. Portanto, vou descrever essa terminologia aqui - na forma como a entendo - e me referir a ela nos outros posts.

Em princípio, tenho em mente postar algo a respeito de como criar a assinatura digital de um XML para a Nota Fiscal Eletrônica (NFe) e como anexar essa assinatura ao documento a ser enviado para a Receita Federal. Considere, então o XML simplificado (bastante !) da NFe que reproduzo abaixo :
<?xml version="1.0"encoding="UTF-8" ?>
<enviNFe versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<idLote>71</idLote>
<NFe>
<infNFe Id="NFe3508059978"versao="1.10">
 <cUF>35</cUF>
 <cNF>518005127</cNF>
 <natOp>Venda a vista</natOp>
 <mod>55</mod>
 <serie>1</serie>
 <dEmi>2008-05-06</dEmi>
 <tpAmb>2</tpAmb>
</infNFe>
 </NFe>
  </enviNFe>

Declaração XML
A primeira linha do XML é um cabeçalho indicando que se trata de um documento XML e que os textos embutidos nele respeitam a codificação UTF-8. Obs: É por essa razão que o XML da NFe que vai para a Receita Federal não pode conter a acentuação típica da língua portuguesa - para isso, a codificação mais apropriada teria que ser a ISO-8859-1.

Elementos ou Tags
Os elementos constituem a fundamentação do XML, moldando a estrutura de dados contida no documento. Eles delimitam as informações do documento e são distinguidos por aparecerem entre os caracteres < e >. No XML reproduzido acima, enviNFe e NFe são exemplos de elementos. Os dados são incluídos no documento entre um elemento de abertura e seu correspondente fechamento, sendo que o elemento de fechamento tem uma barra (/) antes do nome para diferenciá-lo da abertura.Exemplo :
 <dEmi>2008-05-06</dEmi>

Atributos
São propriedades adicionadas à elementos de abertura. Eles são compostos de um nome e de um valor ligados pelo sinal de igual (=). Os valores são delimitados por aspas ("). No XML do exemplo, o elemento infNFe possui 2 atributos : Id (cujo valor é NFe3508059978) e versao (de valor 1.10).

Nós ou Nodes
A representação computacional mais comum para um documento XML é através de DOM - Document Object Model, que permite acessar e manipular os elementos, atributos, valores, etc. através de uma estrutura de árvore. Neste contexto, os elementos também são chamados "nós" e os termos "nó pai" e "nó filho" expressam a relação de hierarquia entre os elementos, isto é, que elemento está contido em qual. Assim, no exemplo acima, os elementos cNF e serie são "nós filhos" de infNFe. Por sua vez, NFe é o "nó pai" de infNFe.

Nó raiz ou Root Node
A hierarquia de um documento XML sempre possui um nó de nível mais alto que, direta ou indiretamente, é "nó pai" de todos os outros. Esse ponto de entrada para navegação no documento XML é chamado "nó raiz" e no exemplo acima é o nó enviNFe

XML Namespace
Com o uso crescente de XML para troca de informações, muitos ramos de negócio, empresas e entidades governamentais construiram conjuntos de tags (elementos) que acabaram por se tornar padrões. São, portanto, bem estabelecidos e há softwares capazes de reconhecê-los e tratá-los. Se for necessário incluir informações de mais de um desses padrões num mesmo documento XML, é possível que haja choque entre as diferentes semânticas (nomes e significados).
Para permitir que uma aplicação reconheça qual conjunto de tags deve ser usado para tratar um determinado ponto do XML foi criado o conceito de namespace. São atributos especiais que são incluídos num elemento do XML de forma que uma aplicação com o conhecimento apropriado saberá que estrutura esperar ao trabalhar com os "nós filhos" desse elemento.
O nome do atributo que indica o namespace é xmlns.
No exemplo da Nota Fiscal Eletrônica, a Receita Federal estruturou as informações sob o namespace http://www.portalfiscal.inf.br/nfe e ele deve constar dos documentos XML a serem enviados.

No próximo post, incluirei exemplo C# de como construir o XML mostrado aqui.

7 de maio de 2009

Modo XP no Windows 7 dependerá do hardware

Há alguns dias, publiquei um post contando o esforço da Microsoft para vencer a resistência dos usuários em trocar o Windows XP pelo novo Windows 7, que ainda nem foi lançado. O foco do esforço descrito lá é o "Modo XP", recurso que permite aos usuários do Windows 7 executarem programas feitos para Windows XP sem correr o risco de incompatibilidade.

No entanto, vi uma notícia hoje explicando que esse recurso se baseia no Virtual PC que, por sua vez, requer tecnologia de virtualização embutida no processador. Ou seja, computadores equipados com processadores Intel ou AMD sem a chamada "virtualization technology" (Intel-VT e AMD-V, respectivamente) não serão capazes de suportar o "Modo XP".

Aqueles que quiserem ou necessitarem usar esse recurso do Windows 7, poderão ter que gastar um dinheiro extra para trocar também o seu hardware. Uma lista dos processadores da Intel, com a indicação se suportam ou não o VT, pode ser encontrada aqui para CPUs de desktop e aqui para CPUs de notebooks. Dos modelos da AMD que ainda estão a venda, apenas o Sempron não possui suporte à virtualização.

Se quiser determinar por software se seu processador possui tal suporte, há um programa chamado SecureAble que é gratuito. Ele exibe algumas informações a respeito de recursos do seu processador que podem afetar a segurança do computador, dentre elas a presença de tecnologia de virtualização baseada em hardware.

Uma outra restrição é que a Microsoft distribuirá o add-on para Modo XP apenas em algumas versões do Windows 7, aquelas mais voltadas ao ambiente corporativo : Professional, Enterprise e Ultimate.

=> Mais Informações
Post sobre lançamento do Windows 7, Site oficial do Windows7, Chips que não suportarão Modo XP, How Many Intel CPUs will fail the XP Mode test ?