Como trabalhar com documentos XML em Delphi? Especificamente com TXMLDocument? Usando o modelo de objeto de documento XML.

Para muitos programadores Delphi, salvar as configurações está associado ao uso INI arquivos em seus programas. A utilização desse método, em projetos mais ou menos sérios, deve ser evitada, pois limita a flexibilidade, o que impede maior expansão do programa. Deve-se dizer que essa abordagem é bastante popular devido à sua facilidade de uso e à presença de ferramentas integradas no ambiente de desenvolvimento.

No entanto, estruturado XML arquivos. Sua vantagem é que o número de parâmetros não pode ser fixo. Para entender isso melhor, considere um exemplo específico.

No programa USearch, quando você clica em uma entrada, um menu de contexto é exibido, no qual uma lista de itens é exibida. Esses itens são comandos, que por sua vez são carregados do arquivo de configurações. Caso as configurações tenham sido armazenadas em INI, então o programa pode salvar e carregar um certo número de comandos, por exemplo 10 ou 50. Assim que um valor maior for necessário, você terá que reescrever o código e recompilá-lo de acordo.


Aplicando uma abordagem usando XML arquivos, seremos capazes de carregar todos os parâmetros da seção dinamicamente. Além disso, o arquivo de configuração ficará mais elegante, sem numeração redundante de parâmetros. Mas, meios padrão trabalhar com XML Delphi tem muitas desvantagens, então eu recomendo usar biblioteca padrão MSXML... Normalmente, é incluído por padrão em sistemas operacionais Família Windows.


Conectar MSXML, precisamos gerar um arquivo de interface com uma lista de todas as funções, importando-o do servidor COM. Muitos artigos detalhados foram escritos sobre como importar a interface, mas eu sugiro que você baixe o arquivo MSXML2_TLB.PAS pronto para usar. Após o download do arquivo, coloque-o próximo ao seu projeto ou solte-o na pasta lib do ambiente Delphi. Assim, todos os programas criados poderão utilizar o módulo MSXML, você só precisa adicionar a linha MSXML2_TLB para usar.

Para maior clareza, considere o seguinte exemplo de uso desta biblioteca:

Procedimento LoadData; var XMLDoc: DOMDocument; Raiz: IXMLDOMElement; começar XMLDoc: = CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Raiz: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("tamanho / largura"). Texto); Raiz: = nulo; XMLDoc: = nulo; fim;

Primeiro, uma instância da classe DOMDocument é criada e, em seguida, o conteúdo do arquivo settings.xml é carregado na memória. Uma vez que, de acordo com o padrão, qualquer XML o arquivo deve conter a marca raiz (em nesse caso config), então precisamos obtê-lo usando a função DocumentElement... Em seguida, o conteúdo é exibido entre as tags. , que por sua vez estão entre as tags ... Assim, a partir do arquivo settings.xml, nosso método irá mostrar o texto na MessageBox "100px".

500px 100px

Aqui, o método SelectSingleNode é aplicado, que leva uma string como parâmetro

Apesar de o tópico de trabalho com XML em Delphi ter sido amplamente discutido na Internet, muitas vezes surgem dúvidas sobre esse tópico em todos os tipos de fóruns.

Eu também escrevi isso, mas gostaria de voltar ao caso real de analisar rapidamente um arquivo XML e extrair dados, o que fiz no trabalho hoje. Não demorei mais de 5 minutos para obter os dados necessários.

Fundo. Hoje eu precisava processar dados sobre programas instalados nos computadores dos usuários (sim, sim, identificamos piratas :)). O departamento técnico me forneceu essas informações obtidas de usuários desavisados ​​em uma rede usando WMI. O programa que eles usaram gera relatórios em Formato XML... Conseqüentemente, eles me trouxeram uma montanha de arquivos XML com uma estrutura bastante complexa, da qual eu só tive que extrair o nome dos produtos de software instalados.

Tratamento. Depois de olhar alguns arquivos à mão, percebi que não demoraria muito para envelhecer e decidi escrever um pequeno conversor. Tendo iniciado o Delphi, selecionei o objeto XML DataBinding do repositório e alimentei-o com um dos arquivos. Deixei todas as configurações e parâmetros por padrão e, como resultado, um módulo com grande quantia classes e interfaces para acessar os elementos deste arquivo XML. Não me preocupei em lidar com a estrutura das classes por um longo tempo, imediatamente comecei a escrever um conversor.

Em um novo aplicativo de console, escrevi um código bem simples:


programa XML2TXT;

usa
Formulários,
Classes, SysUtils,
SoftwareXML em "SoftwareXML.pas";

procedimento CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i: inteiro;
sr: TSearchRec;
CurDir: string;
ExportFile: TStringList;
começar
CurDir: = IncludeTrailingPathDelimiter (ExtractFilePath (Application.ExeName));
se FindFirst (CurDir + "*. xml", faAnyFile, sr) = 0, então
repetir
ExportFile: = TStringList.Create;
softbase: = LoadSTDSoftware (Pchar (CurDir + sr.Name));
para i: = 0 para softbase.InstalledSoftware.source.software.Count - 1 faça
ExportFile.Add (softbase.InstalledSoftware.source.software [i] .DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile (CurDir + softbase.InstalledSoftware.Source.servername + ". Txt");
ExportFile.Free;
até FindNext (sr) 0;
fim;

começar
Application.Initialize;
CovertXML2Text;
fim.

Como resultado, obtive um editor de texto para cada computador da grade, contendo uma lista dos softwares instalados.

Acho que este código exigirá alguma explicação. Por exemplo, por que usei o módulo Formulários em um aplicativo de console e chamei o procedimento Application.Initialize;?

Na verdade, é simples - este é um pequeno hack que permite usar XML Data Binding em um aplicativo de console. Porque ele teimosamente se recusou a inicializar a classe para trabalhar com XML. Ainda não descobri os verdadeiros motivos - o tempo de hoje foi importante, já gastei 4 em 5 minutos lutando contra esse erro. :) Acho que depois vou tratar desse problema e escrever qual é o verdadeiro motivo.

A estranha classe softbase foi criada a partir de um arquivo XML - esse é o nome do elemento raiz, e softbase.InstalledSoftware.source.software [i] .DisplayName é apenas navegar pelos elementos aninhados até o desejado e obter seu valor.

É assim que um dos mais maneiras rápidas trabalhando com XML em Delphi.

O XML é cada vez mais usado para armazenar informações e trocá-las entre aplicativos e sites. Muitos aplicativos usam essa linguagem como linguagem base para armazenar dados, enquanto outros a usam para exportar e importar dados XML. Portanto, é hora de os desenvolvedores começarem a pensar sobre como os dados XML podem ser usados ​​em seus próprios aplicativos.

Neste artigo, veremos o XML Document Object Model (DOM) e a implementação da Microsoft do XML DOM.

O XML DOM é um modelo de objeto que fornece a um desenvolvedor objetos para carregar e processar arquivos XML. O modelo de objeto consiste nos seguintes objetos principais: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap e XMLDOMParseError. Cada um desses objetos (exceto XMLDOMParseError) contém propriedades e métodos que permitem obter informações sobre o objeto, manipular os valores e a estrutura do objeto e navegar na estrutura de um documento XML.

Vamos dar uma olhada nos principais objetos XML DOM e mostrar alguns exemplos de seu uso no Borland Delphi.

Usando XML DOM no Borland Delphi

Para usar o Microsoft XML DOM em aplicativos Delphi, você precisa conectar a biblioteca de tipos apropriada ao projeto. Para isso, executamos o comando Projeto | Import Type Library e na caixa de diálogo Import Type Library, selecione a biblioteca Microsoft XML versão 2.0 (Versão 2.0), que geralmente está localizada no arquivo Windows \ System \ MSXML.DLL

Após clicar no botão Criar Unidade, será criado o módulo de interface MSXML_TLB, que nos permitirá utilizar os objetos XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest e vários outros, implementados na biblioteca MSXML.DLL. A referência ao módulo MSXML_TLB deve estar na lista de Usos.

Dispositivo XML DOM

O Document Object Model representa um documento XML em uma estrutura de árvore de ramos. APIs XML DOM permitem que os aplicativos naveguem na árvore do documento e manipulem suas ramificações. Cada ramo pode ter um tipo específico (DOMNodeType), de acordo com o qual os ramos pai e filho são determinados. A maioria dos documentos XML contém ramificações de elemento de tipo, atributo e texto. Os atributos são um tipo especial de ramificação e não são ramificações secundárias. Para gerenciar atributos, use métodos especiais fornecido por objetos XML DOM.

Além de implementar as interfaces recomendadas do World Wide Web Consortium (W3C), o Microsoft XML DOM contém métodos que oferecem suporte a XSL, padrões XSL, namespaces e tipos de dados. Por exemplo, o método SelectNodes permite usar a sintaxe de padrão XSL para localizar ramificações em um contexto específico, e o método TransformNode oferece suporte ao uso de XSL para realizar transformações.

Documento XML de teste

Como um exemplo de documento XML, vamos pegar um diretório de CD-ROM de música, que tem a seguinte estrutura:

Burlesco imperial Bob dylan EUA Columbia 10.90 1985 Esconda seu coração Bonnie Tylor Reino Unido CBS Records 9.90 1988 ... Liberte meu coração Joe Cocker EUA EMI 8.20 1987

Agora estamos prontos para começar a examinar o modelo de objeto XML DOM, começando com o objeto XMLDOMDocument.

Documento XML - objeto XMLDOMDocument

Trabalhar com um documento XML começa com seu carregamento. Para isso, usamos o método Load, que possui apenas um parâmetro que especifica a URL do documento carregado. Ao carregar arquivos de um disco local, apenas o nome completo do arquivo é especificado (o protocolo file: /// pode ser omitido neste caso). Se o documento XML for armazenado como uma string, use o método LoadXML para carregar o documento.

A propriedade Async é usada para controlar como o documento é carregado (síncrono ou assíncrono). Por padrão, esta propriedade é configurada para True, indicando que o documento é carregado de forma assíncrona e o controle é retornado ao aplicativo antes que o documento seja totalmente carregado. Caso contrário, o documento carrega de forma síncrona e, em seguida, você deve verificar o valor da propriedade ReadyState para saber se o documento foi carregado ou não. Você também pode criar um manipulador para o evento OnReadyStateChange que assumirá o controle quando o valor da propriedade ReadyState for alterado.

O seguinte mostra como carregar um documento XML usando o método Load:

Usa ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; começar XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml’); // // Aqui é onde está o código que manipula // o documento XML e suas ramificações // XMLDoc: = Nil; fim;

Depois que o documento é carregado, podemos acessar suas propriedades. Portanto, a propriedade NodeName conterá o valor #document, a propriedade NodeTypeString conterá o valor do documento e a propriedade URL conterá o valor file: /// C: /DATA/DATA.xml.

Manipulação de erros

De particular interesse são as propriedades relacionadas ao processamento de documentos no carregamento. Por exemplo, a propriedade ParseError retorna um objeto XMLDOMParseError contendo informações sobre um erro que ocorreu durante o processamento do documento.

Para escrever um gerenciador de erros, você pode adicionar o seguinte código:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml’); XMLError: = XMLDoc.ParseError; If XMLError.ErrorCode<>0 Então // // Aqui tratamos do erro // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;

Para descobrir quais informações são retornadas em caso de erro, altere a seguinte entrada do diretório:

Burlesco imperial Bob dylan EUA Columbia 10.90 1985

removendo o elemento de fechamento na segunda linha:</p><p> <CD> <TITLE>Burlesco imperial <ARTIST>Bob dylan</ARTIST> <COUNTRY>EUA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Agora vamos escrever um código que retorne os valores de propriedade do objeto XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; If XMLError.ErrorCode<>0 Em seguida, com XMLError, Memo1.Lines começa a adicionar (‘Arquivo:’ + URL); Adicionar (‘Código:’ + IntToStr (ErrorCode)); Adicionar (‘Erro:’ + Razão); Adicionar (‘Texto:’ + TextoSrc); Adicionar (‘Linha:’ + IntToStr (Linha)); Adicionar (‘Posição:’ + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Fim;</p><p>e execute nosso aplicativo. Como resultado, obtemos as seguintes informações sobre o erro.</p> <p>Como você pode ver no exemplo acima, as informações retornadas pelo objeto XMLDOMParseError são suficientes para localizar o erro e entender a causa de sua ocorrência.</p> <p>Agora vamos restaurar o elemento de fechamento <TITLE>em nosso documento e continue nossa discussão sobre XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Acessando a árvore do documento</h2> <p>Para acessar a árvore do documento, você pode obter o elemento raiz e, a seguir, iterar sobre suas ramificações filhas ou localizar uma ramificação específica. No primeiro caso, obtemos o elemento raiz por meio da propriedade DocumentElement, que retorna um objeto do tipo XMLDOMNode. Veja como usar a propriedade DocumentElement para obter o conteúdo de cada elemento filho:</p><p>Nó Var: IXMLDOMNode; Raiz: IXMLDOMElement; I: Inteiro; ... Root: = XMLDoc.DocumentElement; Para I: = 0 para Root.ChildNodes.Length-1 faça Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Fim;</p><p>Para nosso documento XML, obtemos o seguinte texto.</p> <p>Se estivermos interessados ​​em um branch específico ou um branch abaixo do primeiro branch filho, podemos usar o método NodeFromID ou o método GetElementByTagName do objeto XMLDOMDocument.</p> <p>O método NodeFromID requer um identificador exclusivo conforme definido no Esquema XML ou Definição de Tipo de Documento (DTD) e retorna uma ramificação com esse identificador.</p> <p>O método GetElementByTagName requer uma string com um elemento específico (tag) e retorna todas as ramificações com este elemento. Veja como usar este método para encontrar todos os artistas em nosso diretório de CD-ROM:</p><p>Nós: IXMLDOMNodeList; Nó: IXMLDOMNode; ... Nós: = XMLDoc.GetElementsByTagName (‘ARTIST’); Para I: = 0 para Nodes.Length-1 faça Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Fim;</p><p>Para o nosso documento XML, obteremos o seguinte texto</p> <p>Observe que o método SelectNodes do objeto XMLDOMNode fornece uma maneira mais flexível de acessar as ramificações do documento. Mas mais sobre isso abaixo.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Filial do Documento - Objeto XMLDOMNode</h2> <p>O objeto XMLDOMNode representa uma ramificação do documento. Já encontramos este objeto quando obtivemos o elemento raiz do documento:</p><p>Raiz: = XMLDoc.DocumentElement;</p><p>Para obter informações sobre uma ramificação de um documento XML, você pode usar as propriedades do objeto XMLDOMNode (Tabela 1).</p> <p>Para acessar os dados armazenados em uma ramificação, é comum usar a propriedade NodeValue (disponível para atributos, ramificações de texto, comentários, instruções de processamento e seções CDATA) ou a propriedade Text, que retorna o conteúdo textual da ramificação, ou a propriedade NodeTypedValue. O último, no entanto, só pode ser usado para ramificações com itens digitados.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navegando na árvore do documento</h3> <p>O objeto XMLDOMNode fornece muitas maneiras de navegar na árvore do documento. Por exemplo, para acessar o branch pai, use a propriedade ParentNode (tipo XMLDOMNode), acesse os branches filho através das propriedades ChildNodes (tipo XMLDOMNodeList), FirstChild e LastChild (tipo XMLDOMNode), etc. A propriedade OwnerDocument retorna um objeto XMLDOMDocument que identifica o próprio documento XML. As propriedades listadas acima facilitam a navegação na árvore do documento.</p> <p>Agora vamos percorrer todas as ramificações do documento XML:</p><p>Raiz: = XMLDoc.DocumentElement; Para I: = 0 para Root.ChildNodes.Length-1 faça Begin Node: = Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); Fim;</p><p>Conforme observado acima, o SelectNodes do objeto XMLDOMNode fornece uma maneira mais flexível de acessar as ramificações do documento. Além disso, existe um método SelectSingleNode que retorna apenas a primeira ramificação do documento. Ambos os métodos permitem definir modelos XSL para pesquisas de ramificação.</p> <p>Vejamos o processo de uso do método SelectNodes para buscar todas as ramificações que possuem uma ramificação de CD e uma sub-ramificação PRICE:</p><p>Raiz: = XMLDoc.DocumentElement; Nós: = Root.SelectNodes (‘CD / PRICE’);</p><p>Todos os sub-ramos PRICE do ramo CD serão colocados na coleção Nodes. Voltaremos a discutir os modelos XSL um pouco mais tarde.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulando ramos filhos</h3> <p>Para manipular ramos filhos, podemos usar os métodos do objeto XMLDOMNode (Tabela 2).</p> <p>Para excluir completamente o registro sobre o primeiro disco, você precisa executar o seguinte código:</p><p>Var XMLDoc: IXMLDOMDocument; Raiz: IXMLDOMNode; Nó: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml’); // Obtenha o elemento raiz Root: = XMLDoc.DocumentElement; Nó: = Raiz; // Remova o primeiro branch filho Node.RemoveChild (Node.FirstChild);</p><p>Observe que, neste exemplo, estamos excluindo o primeiro branch filho. Como remover o primeiro elemento do primeiro branch filho é mostrado abaixo:</p><p>Var XMLDoc: IXMLDOMDocument; Raiz: IXMLDOMNode; Nó: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml’); // Obtenha o elemento raiz Root: = XMLDoc.DocumentElement; // e o primeiro branch filho Node: = Root.FirstChild; // Remova o primeiro branch filho Node.RemoveChild (Node.FirstChild);</p><p>No exemplo acima, não excluímos o primeiro branch <CD>…</CD> e o primeiro elemento do ramo é <TITLE>….

Agora vamos adicionar um novo branch. Abaixo está o código que mostra como adicionar uma nova entrada de CD-ROM de música:

Var NewNode: IXMLDOMNode; Filho: IXMLDOMNode; ... // Crie um novo ramo - NewNode: = XMLDoc.CreateNode (1, ‘CD’, ‘’); // Adicione um elemento Filho: = XMLDoc.CreateNode (1, ‘TITLE’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘Pink Floyd’; // Adicione um elemento <ARTIST>Filho: = XMLDoc.CreateNode (1, ‘ARTIST’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘Division Bell’; // Adicione um elemento <COUNTRY>Filho: = XMLDoc.CreateNode (1, ‘PAÍS’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘UK’; // Adicione um elemento <COMPANY>Filho: = XMLDoc.CreateNode (1, ‘COMPANY’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘EMI Records Ltd.’; // Adicione um elemento <PRICE>Filho: = XMLDoc.CreateNode (1, ‘PRICE’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E definir seu valor Child.Text: = '11 .99 "; // Adicionar um elemento <YEAR>Filho: = XMLDoc.CreateNode (1, ‘ANO’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘1994’; // E adiciona um branch Root.AppendChild (NewNode); ...</p><p>O código acima mostra a seguinte sequência de etapas para adicionar um novo branch:</p> <ul><li>Criação de um novo branch usando o método CreateNode: <ul><li>criar um elemento usando o método CreateNode;</li> <li>adicionar um elemento a uma ramificação usando o método AppendChild;</li> <li>definir o valor de um elemento por meio da propriedade Text;</li> <li>… Repita para todos os elementos.</li> </ul></li> <li>Adicionando uma nova ramificação ao documento usando o método AppendChild.</li> </ul><p>Lembre-se de que o método AppendChild adiciona um galho ao final da árvore. Para adicionar um ramo a um local específico na árvore, você precisa usar o método InsertBefore.</p> <h2>Conjunto de filiais - objeto XMLDOMNodeList</h2> <p>O objeto XMLNodeList contém uma lista de ramificações, que pode ser construída usando os métodos SelectNodes ou GetElementsByTagName, e também obtida da propriedade ChildNodes.</p> <p>Já discutimos o uso deste objeto no exemplo fornecido na seção "Navegando na árvore do documento". Aqui iremos fornecer alguns comentários teóricos.</p> <p>O número de ramos na lista pode ser obtido como o valor da propriedade Comprimento. As ramificações são indexadas de 0 a Comprimento-1 e cada ramificação individual é acessível por meio do item indexado correspondente na matriz Item.</p> <p>A navegação pela lista de ramificações também pode ser feita usando o método NextNode, que retorna a próxima ramificação da lista ou Nil se a ramificação atual for a última. Para retornar ao topo da lista, chame o método Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Crie e salve documentos</h2> <p>Portanto, cobrimos como você pode adicionar ramificações e elementos a documentos XML existentes. Agora vamos criar um documento XML dinamicamente. Em primeiro lugar, lembre-se de que um documento pode ser carregado não apenas de uma URL, mas também de uma string regular. Veja como criar um elemento raiz, que pode então ser usado para construir dinamicamente o resto dos elementos (que já abordamos na seção Manipulando ramos filho):</p><p>Var XMLDoc: IXMLDOMDocument; Raiz: IXMLDOMNode; Nó: IXMLDOMNode; S: WideString; ... S: = ‘ <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Raiz: = XMLDoc.DocumentElement; Nó: = XMLDoc.CreateNode (1, ‘CD’, ‘’); Root.AppendChild (Node); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;</p><p>Após construir o documento XML, salve-o em um arquivo usando o método Save. Por exemplo:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Além de salvar em um arquivo, o método Save permite salvar um documento XML em um novo objeto XMLDOMDocument. Nesse caso, o documento é totalmente processado e, como resultado, sua estrutura e sintaxe são verificadas. Veja como salvar um documento em outro objeto:</p><p>Procedimento TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; começar XMLDoc2: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Nil; fim;</p><p>Em conclusão, o método Save também permite salvar o documento XML em outros objetos COM que suportam as interfaces IStream, IPersistStream ou IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Usando modelos XSL</h2> <p>Ao discutir o método SelectNodes do objeto XMLDOMNode, mencionamos que ele fornece uma maneira mais flexível de acessar as ramificações do documento. A flexibilidade é que você pode especificar um modelo XSL como o critério para selecionar ramos. Esses modelos fornecem um mecanismo poderoso para localizar informações em documentos XML. Por exemplo, para obter uma lista de todos os títulos de CD-ROM de música em nosso diretório, você pode executar a seguinte consulta:</p><p>Para saber quais discos de artistas são lançados nos EUA, o pedido é feito da seguinte forma:</p><p>Nós: = Root.SelectNodes (‘CD / ARTIST’);</p><p>Veja como encontrar a primeira unidade em um diretório:</p><p>Nós: = Root.SelectNodes (‘CD / TITLE’);</p><p>E por ultimo:</p><p>Nós: = Root.SelectNodes (‘CD / TITLE’);</p><p>Para encontrar os discos de Bob Dylan, você pode executar a seguinte consulta:</p><p>Nós: = Root.SelectNodes (‘CD [$ any $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>e para obter uma lista de discos feitos depois de 1985, executamos a seguinte consulta:</p><p>Nós: = Root.SelectNodes (‘CD / TITLE’);</p><p>Uma discussão mais detalhada da sintaxe XSL requer uma publicação separada. Para intrigar os leitores e encorajar pesquisas futuras, darei apenas um pequeno exemplo do possível uso de XSL. Digamos que precisamos converter nosso catálogo em uma tabela HTML normal. Usando os métodos tradicionais, devemos iterar sobre todos os ramos da árvore e para cada elemento recebido formar as tags correspondentes <TD>…</TD>.</p> <p>Usando XSL, simplesmente criamos um modelo (ou folha de estilo) que especifica o que transformar e como. Em seguida, sobrepomos esse modelo em nosso catálogo - e pronto: temos o texto de um modelo XSL que transforma o catálogo em uma tabela (Listagem 2).</p> <p>O código para sobrepor um modelo XSL em nosso diretório se parece com este:</p><p>Procedimento TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; começar XSLDoc: = CoDOMDocument.Create; XSLDoc.Load (‘C: \ DATA \ DATA.xsl’); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = Nil; fim;</p><p>Concluindo nossa discussão sobre XSL, deve-se dizer que, no momento, essa linguagem é ativamente usada para a transformação entre vários documentos XML, bem como para a formatação de documentos.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Conclusão</h2> <p>Por razões óbvias, é impossível cobrir todos os objetos Microsoft XML DOM e fornecer exemplos de seu uso em um artigo. Aqui, acabamos de abordar as questões básicas do uso de XML DOM em aplicativos. Mesa 3 mostra todos os objetos implementados no Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>O XML é cada vez mais usado para armazenar informações e trocá-las entre aplicativos e sites. Muitos aplicativos usam essa linguagem como linguagem base para armazenar dados, enquanto outros a usam para exportar e importar dados XML. Portanto, é hora de os desenvolvedores começarem a pensar sobre como os dados XML podem ser usados ​​em seus próprios aplicativos.</p> <p>Neste artigo, veremos o XML Document Object Model (DOM) e a implementação da Microsoft do XML DOM.</p> <p>O XML DOM é um modelo de objeto que fornece a um desenvolvedor objetos para carregar e processar arquivos XML. O modelo de objeto consiste nos seguintes objetos principais: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap e XMLDOMParseError. Cada um desses objetos (exceto XMLDOMParseError) contém propriedades e métodos que permitem obter informações sobre o objeto, manipular os valores e a estrutura do objeto e navegar na estrutura de um documento XML.</p> <p>Vamos dar uma olhada nos principais objetos XML DOM e mostrar alguns exemplos de seu uso no Borland Delphi.</p> <h2>Usando XML DOM no Borland Delphi</h2> <p>Para usar o Microsoft XML DOM em aplicativos Delphi, você precisa conectar a biblioteca de tipos apropriada ao projeto. Para isso, executamos o comando Projeto | Import Type Library e na caixa de diálogo Import Type Library, selecione a biblioteca Microsoft XML versão 2.0 (Versão 2.0), que geralmente está localizada no arquivo Windows \ System \ MSXML.DLL</p> <p>Após clicar no botão Criar Unidade, será criado o módulo de interface MSXML_TLB, que nos permitirá utilizar os objetos XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest e vários outros, implementados na biblioteca MSXML.DLL. A referência ao módulo MSXML_TLB deve estar na lista de Usos.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Dispositivo XML DOM</h2> <p>O Document Object Model representa um documento XML em uma estrutura de árvore de ramos. APIs XML DOM permitem que os aplicativos naveguem na árvore do documento e manipulem suas ramificações. Cada ramo pode ter um tipo específico (DOMNodeType), de acordo com o qual os ramos pai e filho são determinados. A maioria dos documentos XML contém ramificações de elemento de tipo, atributo e texto. Os atributos são um tipo especial de ramificação e não são ramificações secundárias. Métodos especiais fornecidos por objetos XML DOM são usados ​​para manipular atributos.</p> <p>Além de implementar as interfaces recomendadas do World Wide Web Consortium (W3C), o Microsoft XML DOM contém métodos que oferecem suporte a XSL, padrões XSL, namespaces e tipos de dados. Por exemplo, o método SelectNodes permite usar a sintaxe de padrão XSL para localizar ramificações em um contexto específico, e o método TransformNode oferece suporte ao uso de XSL para realizar transformações.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Documento XML de teste</h2> <p>Como um exemplo de documento XML, vamos pegar um diretório de CD-ROM de música, que tem a seguinte estrutura:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Burlesco imperial Bob dylan EUA Columbia 10.90 1985 Esconda seu coração Bonnie Tylor Reino Unido CBS Records 9.90 1988 ... Liberte meu coração Joe Cocker EUA EMI 8.20 1987

Agora estamos prontos para começar a examinar o modelo de objeto XML DOM, começando com o objeto XMLDOMDocument.

Documento XML - objeto XMLDOMDocument

Trabalhar com um documento XML começa com seu carregamento. Para isso, usamos o método Load, que possui apenas um parâmetro que especifica a URL do documento carregado. Ao carregar arquivos de um disco local, apenas o nome completo do arquivo é especificado (o protocolo file: /// pode ser omitido neste caso). Se o documento XML for armazenado como uma string, use o método LoadXML para carregar o documento.

A propriedade Async é usada para controlar como o documento é carregado (síncrono ou assíncrono). Por padrão, esta propriedade é configurada para True, indicando que o documento é carregado de forma assíncrona e o controle é retornado ao aplicativo antes que o documento seja totalmente carregado. Caso contrário, o documento carrega de forma síncrona e, em seguida, você deve verificar o valor da propriedade ReadyState para saber se o documento foi carregado ou não. Você também pode criar um manipulador para o evento OnReadyStateChange que assumirá o controle quando o valor da propriedade ReadyState for alterado.

O seguinte mostra como carregar um documento XML usando o método Load:

Usa ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; começar XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml’); // // Aqui é onde está o código que manipula // o documento XML e suas ramificações // XMLDoc: = Nil; fim;

Depois que o documento é carregado, podemos acessar suas propriedades. Portanto, a propriedade NodeName conterá o valor #document, a propriedade NodeTypeString conterá o valor do documento e a propriedade URL conterá o valor file: /// C: /DATA/DATA.xml.

Manipulação de erros

De particular interesse são as propriedades relacionadas ao processamento de documentos no carregamento. Por exemplo, a propriedade ParseError retorna um objeto XMLDOMParseError contendo informações sobre um erro que ocorreu durante o processamento do documento.

Para escrever um gerenciador de erros, você pode adicionar o seguinte código:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml’); XMLError: = XMLDoc.ParseError; If XMLError.ErrorCode<>0 Então // // Aqui tratamos do erro // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;

Para descobrir quais informações são retornadas em caso de erro, altere a seguinte entrada do diretório:

Burlesco imperial Bob dylan EUA Columbia 10.90 1985

removendo o elemento de fechamento na segunda linha:</p><p> <CD> <TITLE>Burlesco imperial <ARTIST>Bob dylan</ARTIST> <COUNTRY>EUA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Agora vamos escrever um código que retorne os valores de propriedade do objeto XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; If XMLError.ErrorCode<>0 Em seguida, com XMLError, Memo1.Lines começa a adicionar (‘Arquivo:’ + URL); Adicionar (‘Código:’ + IntToStr (ErrorCode)); Adicionar (‘Erro:’ + Razão); Adicionar (‘Texto:’ + TextoSrc); Adicionar (‘Linha:’ + IntToStr (Linha)); Adicionar (‘Posição:’ + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Fim;</p><p>e execute nosso aplicativo. Como resultado, obtemos as seguintes informações sobre o erro.</p> <p>Como você pode ver no exemplo acima, as informações retornadas pelo objeto XMLDOMParseError são suficientes para localizar o erro e entender a causa de sua ocorrência.</p> <p>Agora vamos restaurar o elemento de fechamento <TITLE>em nosso documento e continue nossa discussão sobre XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Acessando a árvore do documento</h2> <p>Para acessar a árvore do documento, você pode obter o elemento raiz e, a seguir, iterar sobre suas ramificações filhas ou localizar uma ramificação específica. No primeiro caso, obtemos o elemento raiz por meio da propriedade DocumentElement, que retorna um objeto do tipo XMLDOMNode. Veja como usar a propriedade DocumentElement para obter o conteúdo de cada elemento filho:</p><p>Nó Var: IXMLDOMNode; Raiz: IXMLDOMElement; I: Inteiro; ... Root: = XMLDoc.DocumentElement; Para I: = 0 para Root.ChildNodes.Length-1 faça Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Fim;</p><p>Para nosso documento XML, obtemos o seguinte texto.</p> <p>Se estivermos interessados ​​em um branch específico ou um branch abaixo do primeiro branch filho, podemos usar o método NodeFromID ou o método GetElementByTagName do objeto XMLDOMDocument.</p> <p>O método NodeFromID requer um identificador exclusivo conforme definido no Esquema XML ou Definição de Tipo de Documento (DTD) e retorna uma ramificação com esse identificador.</p> <p>O método GetElementByTagName requer uma string com um elemento específico (tag) e retorna todas as ramificações com este elemento. Veja como usar este método para encontrar todos os artistas em nosso diretório de CD-ROM:</p><p>Nós: IXMLDOMNodeList; Nó: IXMLDOMNode; ... Nós: = XMLDoc.GetElementsByTagName (‘ARTIST’); Para I: = 0 para Nodes.Length-1 faça Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Fim;</p><p>Para o nosso documento XML, obteremos o seguinte texto</p> <p>Observe que o método SelectNodes do objeto XMLDOMNode fornece uma maneira mais flexível de acessar as ramificações do documento. Mas mais sobre isso abaixo.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Filial do Documento - Objeto XMLDOMNode</h2> <p>O objeto XMLDOMNode representa uma ramificação do documento. Já encontramos este objeto quando obtivemos o elemento raiz do documento:</p><p>Raiz: = XMLDoc.DocumentElement;</p><p>Para obter informações sobre uma ramificação de um documento XML, você pode usar as propriedades do objeto XMLDOMNode (Tabela 1).</p> <p>Para acessar os dados armazenados em uma ramificação, é comum usar a propriedade NodeValue (disponível para atributos, ramificações de texto, comentários, instruções de processamento e seções CDATA) ou a propriedade Text, que retorna o conteúdo textual da ramificação, ou a propriedade NodeTypedValue. O último, no entanto, só pode ser usado para ramificações com itens digitados.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navegando na árvore do documento</h3> <p>O objeto XMLDOMNode fornece muitas maneiras de navegar na árvore do documento. Por exemplo, para acessar o branch pai, use a propriedade ParentNode (tipo XMLDOMNode), acesse os branches filho através das propriedades ChildNodes (tipo XMLDOMNodeList), FirstChild e LastChild (tipo XMLDOMNode), etc. A propriedade OwnerDocument retorna um objeto XMLDOMDocument que identifica o próprio documento XML. As propriedades listadas acima facilitam a navegação na árvore do documento.</p> <p>Agora vamos percorrer todas as ramificações do documento XML:</p><p>Raiz: = XMLDoc.DocumentElement; Para I: = 0 para Root.ChildNodes.Length-1 faça Begin Node: = Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); Fim;</p><p>Conforme observado acima, o SelectNodes do objeto XMLDOMNode fornece uma maneira mais flexível de acessar as ramificações do documento. Além disso, existe um método SelectSingleNode que retorna apenas a primeira ramificação do documento. Ambos os métodos permitem definir modelos XSL para pesquisas de ramificação.</p> <p>Vejamos o processo de uso do método SelectNodes para buscar todas as ramificações que possuem uma ramificação de CD e uma sub-ramificação PRICE:</p><p>Raiz: = XMLDoc.DocumentElement; Nós: = Root.SelectNodes (‘CD / PRICE’);</p><p>Todos os sub-ramos PRICE do ramo CD serão colocados na coleção Nodes. Voltaremos a discutir os modelos XSL um pouco mais tarde.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulando ramos filhos</h3> <p>Para manipular ramos filhos, podemos usar os métodos do objeto XMLDOMNode (Tabela 2).</p> <p>Para excluir completamente o registro sobre o primeiro disco, você precisa executar o seguinte código:</p><p>Var XMLDoc: IXMLDOMDocument; Raiz: IXMLDOMNode; Nó: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml’); // Obtenha o elemento raiz Root: = XMLDoc.DocumentElement; Nó: = Raiz; // Remova o primeiro branch filho Node.RemoveChild (Node.FirstChild);</p><p>Observe que, neste exemplo, estamos excluindo o primeiro branch filho. Como remover o primeiro elemento do primeiro branch filho é mostrado abaixo:</p><p>Var XMLDoc: IXMLDOMDocument; Raiz: IXMLDOMNode; Nó: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml’); // Obtenha o elemento raiz Root: = XMLDoc.DocumentElement; // e o primeiro branch filho Node: = Root.FirstChild; // Remova o primeiro branch filho Node.RemoveChild (Node.FirstChild);</p><p>No exemplo acima, não excluímos o primeiro branch <CD>…</CD> e o primeiro elemento do ramo é <TITLE>….

Agora vamos adicionar um novo branch. Abaixo está o código que mostra como adicionar uma nova entrada de CD-ROM de música:

Var NewNode: IXMLDOMNode; Filho: IXMLDOMNode; ... // Crie um novo ramo - NewNode: = XMLDoc.CreateNode (1, ‘CD’, ‘’); // Adicione um elemento Filho: = XMLDoc.CreateNode (1, ‘TITLE’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘Pink Floyd’; // Adicione um elemento <ARTIST>Filho: = XMLDoc.CreateNode (1, ‘ARTIST’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘Division Bell’; // Adicione um elemento <COUNTRY>Filho: = XMLDoc.CreateNode (1, ‘PAÍS’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘UK’; // Adicione um elemento <COMPANY>Filho: = XMLDoc.CreateNode (1, ‘COMPANY’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘EMI Records Ltd.’; // Adicione um elemento <PRICE>Filho: = XMLDoc.CreateNode (1, ‘PRICE’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E definir seu valor Child.Text: = '11 .99 "; // Adicionar um elemento <YEAR>Filho: = XMLDoc.CreateNode (1, ‘ANO’, ‘’); // Adiciona um elemento NewNode.AppendChild (Child); // E defina seu valor Child.Text: = ‘1994’; // E adiciona um branch Root.AppendChild (NewNode); ...</p><p>O código acima mostra a seguinte sequência de etapas para adicionar um novo branch:</p> <ul><li>Criação de um novo branch usando o método CreateNode: <ul><li>criar um elemento usando o método CreateNode;</li> <li>adicionar um elemento a uma ramificação usando o método AppendChild;</li> <li>definir o valor de um elemento por meio da propriedade Text;</li> <li>… Repita para todos os elementos.</li> </ul></li> <li>Adicionando uma nova ramificação ao documento usando o método AppendChild.</li> </ul><p>Lembre-se de que o método AppendChild adiciona um galho ao final da árvore. Para adicionar um ramo a um local específico na árvore, você precisa usar o método InsertBefore.</p> <h2>Conjunto de filiais - objeto XMLDOMNodeList</h2> <p>O objeto XMLNodeList contém uma lista de ramificações, que pode ser construída usando os métodos SelectNodes ou GetElementsByTagName, e também obtida da propriedade ChildNodes.</p> <p>Já discutimos o uso deste objeto no exemplo fornecido na seção "Navegando na árvore do documento". Aqui iremos fornecer alguns comentários teóricos.</p> <p>O número de ramos na lista pode ser obtido como o valor da propriedade Comprimento. As ramificações são indexadas de 0 a Comprimento-1 e cada ramificação individual é acessível por meio do item indexado correspondente na matriz Item.</p> <p>A navegação pela lista de ramificações também pode ser feita usando o método NextNode, que retorna a próxima ramificação da lista ou Nil se a ramificação atual for a última. Para retornar ao topo da lista, chame o método Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Crie e salve documentos</h2> <p>Portanto, cobrimos como você pode adicionar ramificações e elementos a documentos XML existentes. Agora vamos criar um documento XML dinamicamente. Em primeiro lugar, lembre-se de que um documento pode ser carregado não apenas de uma URL, mas também de uma string regular. Veja como criar um elemento raiz, que pode então ser usado para construir dinamicamente o resto dos elementos (que já abordamos na seção Manipulando ramos filho):</p><p>Var XMLDoc: IXMLDOMDocument; Raiz: IXMLDOMNode; Nó: IXMLDOMNode; S: WideString; ... S: = ‘ <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Raiz: = XMLDoc.DocumentElement; Nó: = XMLDoc.CreateNode (1, ‘CD’, ‘’); Root.AppendChild (Node); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;</p><p>Após construir o documento XML, salve-o em um arquivo usando o método Save. Por exemplo:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Além de salvar em um arquivo, o método Save permite salvar um documento XML em um novo objeto XMLDOMDocument. Nesse caso, o documento é totalmente processado e, como resultado, sua estrutura e sintaxe são verificadas. Veja como salvar um documento em outro objeto:</p><p>Procedimento TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; começar XMLDoc2: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Nil; fim;</p><p>Em conclusão, o método Save também permite salvar o documento XML em outros objetos COM que suportam as interfaces IStream, IPersistStream ou IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Usando modelos XSL</h2> <p>Ao discutir o método SelectNodes do objeto XMLDOMNode, mencionamos que ele fornece uma maneira mais flexível de acessar as ramificações do documento. A flexibilidade é que você pode especificar um modelo XSL como o critério para selecionar ramos. Esses modelos fornecem um mecanismo poderoso para localizar informações em documentos XML. Por exemplo, para obter uma lista de todos os títulos de CD-ROM de música em nosso diretório, você pode executar a seguinte consulta:</p><p>Para saber quais discos de artistas são lançados nos EUA, o pedido é feito da seguinte forma:</p><p>Nós: = Root.SelectNodes (‘CD / ARTIST’);</p><p>Veja como encontrar a primeira unidade em um diretório:</p><p>Nós: = Root.SelectNodes (‘CD / TITLE’);</p><p>E por ultimo:</p><p>Nós: = Root.SelectNodes (‘CD / TITLE’);</p><p>Para encontrar os discos de Bob Dylan, você pode executar a seguinte consulta:</p><p>Nós: = Root.SelectNodes (‘CD [$ any $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>e para obter uma lista de discos feitos depois de 1985, executamos a seguinte consulta:</p><p>Nós: = Root.SelectNodes (‘CD / TITLE’);</p><p>Uma discussão mais detalhada da sintaxe XSL requer uma publicação separada. Para intrigar os leitores e encorajar pesquisas futuras, darei apenas um pequeno exemplo do possível uso de XSL. Digamos que precisamos converter nosso catálogo em uma tabela HTML normal. Usando os métodos tradicionais, devemos iterar sobre todos os ramos da árvore e para cada elemento recebido formar as tags correspondentes <TD>…</TD>.</p> <p>Usando XSL, simplesmente criamos um modelo (ou folha de estilo) que especifica o que transformar e como. Em seguida, sobrepomos esse modelo em nosso catálogo - e pronto: temos o texto de um modelo XSL que transforma o catálogo em uma tabela (Listagem 2).</p> <p>O código para sobrepor um modelo XSL em nosso diretório se parece com este:</p><p>Procedimento TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; começar XSLDoc: = CoDOMDocument.Create; XSLDoc.Load (‘C: \ DATA \ DATA.xsl’); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = Nil; fim;</p><p>Concluindo nossa discussão sobre XSL, deve-se dizer que, no momento, essa linguagem é ativamente usada para a transformação entre vários documentos XML, bem como para a formatação de documentos.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Conclusão</h2> <p>Por razões óbvias, é impossível cobrir todos os objetos Microsoft XML DOM e fornecer exemplos de seu uso em um artigo. Aqui, acabamos de abordar as questões básicas do uso de XML DOM em aplicativos. Mesa 3 mostra todos os objetos implementados no Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>Eu dou as boas-vindas a todos! Por vários anos, tenho escrito em Matlab e, então, estava impaciente para escrever um programa em Delphi.</p><p>Preciso aprender a trabalhar com documentos xml. Eu trabalho na RAD Stiduo XE3. Existe um componente TXMLDocument, provavelmente conhecido por muitos programadores Delphi. Parece ser capaz de fazer muito. Mas o problema é que não há documentação e descrição claras para isso. A ajuda no RAD Studio é uma besteira, porque não há informações normais ali; apenas espalhado pelas páginas de ajuda escassa em alguns métodos e procedimentos (sem exemplos e descrição normal). Vasculhou toda a Internet. Só encontrei tópicos em fóruns com solução de problemas específicos, onde você tem que adivinhar por mais uma hora o que esta ou aquela linha está fazendo, associada ao acesso ao arquivo xml. <br>Também preciso de um manual sobre as principais funções, procedimentos e métodos usados ​​ao trabalhar com xml. Livro, manual, descrição. Ou pelo menos "xml em Delphi para manequins". Por exemplo:</p><p><i>Para abrir um arquivo xml, use o método XMLDocument1.LoadFromFile ("filemane.xml"), onde filename é o nome do arquivo. <br>A variável nodelist do tipo IXMLNode é usada para armazenar a lista de filhos. O método Xmldocument1.DocumentElement (em que XMLDocument1 é o arquivo xml a ser examinado) é usado para definir essa lista. <br>Para consultar o conteúdo do elemento filho "element1", use o método XMLDocument1.DocumentElement.ChildNodes ["element1"]. Text .... <br></i><br>e, com esse espírito, mais adiante em todos os métodos, procedimentos e tipos de dados aplicados. <br>Onde posso encontrar manuais / descrições semelhantes? Quem pode ajudar?</p><p>Se você precisar de uma tarefa específica, vou descrevê-la. <br>Existe um documento xml no formato:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>up.jpg</assets><br> <images><br> <pano> <tiles>pano_u.jpg</tiles><br> <tiles>pano_f.jpg</tiles><br> </pano><br> <tour><br> <tourimages>start.jpg</tourimages><br> <tourimages>tmb.jpg</tourimages><br> </tour><br> </images><br></templateFiles><br><dimensions><br> <tiles type="pc">1910</tiles><br> <tiles type="ipad">768</tiles><br> <tiles side="iphone">512</tiles><br> <tourimages name="start.jpg" edge="long">1024</tourimages><br> <tourimages name="start.jpg" edge="short">768</tourimages><br></dimensions></p><p><hotspot name="hs015_2" style="mappoint" scena="scene017" ath="68.17644363437007" /><br><hotspot name="hs015_1" style="mappoint" scena="scene014" rz="4436007" /> <br><data name="onstart" mode="noVoice">Algum texto</data><br><data name="onerror" mode="noVoice">Algum erro de texto</data><br><data name="onerror" mode="alarm">Outro errortext</data></p><p>No código do programa, temos:</p><p>var <br>...<br>pai, filho1: IXMLNode;</p><p>começar <br>XMLDocument1.LoadFromFile ("f: \ filename.x ml"); <br>XMLDocument1.Active: = true; <br>.<br>.<br>fim</p><p>O que você precisa aprender a fazer: <br>(Peço desculpas antecipadamente se nomear incorretamente os componentes do documento xml) <br>1. Obtenha o nome do elemento raiz (no nosso caso, ltm), bem como uma lista de seus atributos (versão, tipo) e seus valores ("1.0", "configurações"). <br>2. Obtenha o número de elementos que são filhos da raiz. Neste caso, existem 7 deles: templateFiles, dimensões, hotspot, hotspot, data, data, data. Obtenha os nomes dos elementos (tags) (templateFiles, dimensões, etc.). Depois de obter o número de elementos e aprender como extrair seus nomes, irei fazer um loop de 0 a count-1 e farei o que preciso. <br>3. Obtenha o número e a lista de atributos do elemento necessário. Por exemplo, para o elemento de ponto de acesso. A resposta correta seria 4 atributos. Para o primeiro elemento de ponto de acesso, eles serão name, style, scena, ath. Para o segundo - o mesmo, apenas em vez do atributo ath - o atributo rz. <br>Observe que há 2 elementos de ponto de acesso no arquivo, com atributos diferentes. Veja como trabalhar com eles (se houver mais de 1 elemento com o mesmo nome)? <br>Eu quero assim: eu recebo uma lista de crianças por rel. para o raiz (consulte a pág. 2), execute um loop for através deles e encontre os elementos do ponto de acesso nos quais o parâmetro de nome é igual ao necessário (diga "hs015_2" - certamente haverá um desses elementos). É possível resolver esse problema de alguma forma sem um loop? Ou seja, obter o valor do atributo scena para o elemento hotspot com name = "hs015_2"? <br>4. Faça o acima para nós e elementos que são filhos em relação aos filhos. No meu exemplo, um nó (filho de e pai de e. <br>Se bem entendi, você precisa de alguma forma transferir o conteúdo do nó para <a href="https://obanracer.ru/pt/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">variável como</a> IXMLNode e faça o mesmo que nos itens 1-3. Então?</p><p>5. Você precisa aprender como alterar os parâmetros acima (definir os seus próprios).</p><p>Parece tão longe. Nesse estágio, as construções sintáticas são as mais importantes para mim. <br>Quem é o proprietário deste tópico, escreva outras construções sintáticas para resolver os problemas acima (como obter atributos, seu número, número de elementos, seus nomes, etc.). O principal agora é dominar a sintaxe e implementarei meu algoritmo mais tarde. Muito obrigado antecipadamente!</p><p>P.S. Eu realmente não gostaria de escrever meu próprio analisador XML do zero apenas porque não há uma descrição normal para os existentes.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> <div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div> </div> <footer> <div class="td-block-row td-post-next-prev"> <div class="td-block-span6 td-post-prev-post"> <div class="td-post-next-prev-content"><span>Artigo anterior</span><a href="https://obanracer.ru/pt/stoimost-zameny-stekla-na-ipad-stoimost-zameny-stekla-na-ipad-skolko-stoit.html">O custo de substituir o vidro em um iPad Quanto custa para substituir o vidro em um iPad 2</a></div> </div> <!-- /next_post --> <div class="td-next-prev-separator"></div> <div class="td-block-span6 td-post-next-post"> <div class="td-post-next-prev-content"><span>Artigo seguinte</span><a href="https://obanracer.ru/pt/stoimost-zameny-stekla-na-ipad-stoimost-zameny-stekla-na-ipad-skolko-budet.html">O custo de substituir o vidro em um iPad Quanto custará para substituir o vidro em um iPad</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/pt/author/iulia">Yuliya</a></span></div> <span style="display: none;" itemprop="author" itemscope itemtype="https://schema.org/Person"><meta itemprop="name" content="Юлия"></span> <meta itemprop="datePublished" content="2016-05-16T15:47:37+00:00"> <meta itemprop="dateModified" content="2016-10-25T16:54:41+00:00"> <meta itemscope itemprop="mainEntityOfPage" itemType="https://schema.org/WebPage" itemid="/other/kak-zavyazat-galstuk-foto-poshagovo.html" /><span style="display: none;" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><span style="display: none;" itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="//obanracer.ru/wp-content/uploads/2017/01/logo-300x100.png"></span> <meta itemprop="name" content="Мой секрет"> </span> <meta itemprop="headline " content="Как завязать галстук пошагово фото"><span style="display: none;" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="/wp-content/uploads/2016/05/1-19.jpg"><meta itemprop="width" content="640"><meta itemprop="height" content="450"></span> </footer> </article> <div class="td_block_wrap td_block_related_posts td_uid_3_5a236fb03c961_rand td_with_ajax_pagination td-pb-border-top td_block_template_1" data-td-block-uid="td_uid_3_5a236fb03c961" ><script>var block_td_uid_3_5a236fb03c961 = new tdBlock(); block_td_uid_3_5a236fb03c961.id = "td_uid_3_5a236fb03c961"; block_td_uid_3_5a236fb03c961.atts = '{ "limit":9,"sort":"","post_ids":"","tag_slug":"","autors_id":"","installed_post_types":"","category_id":"","category_ids":"","custom_title":"","custom_url":"","show_child_cat":"","sub_cat_ajax":"","ajax_pagination":"next_prev","header_color":"","header_text_color":"","ajax_pagination_infinite_stop":"","td_column_number":3,"td_ajax_preloading":"","td_ajax_filter_type":"td_custom_related","td_ajax_filter_ids":"","td_filter_default_txt":"\u0412\u0441\u0435","color_preset":"","border_top":"","class":"td_uid_3_5a236fb03c961_rand","el_class":"","offset":"","css":"","tdc_css":"","tdc_css_class":"td_uid_3_5a236fb03c961_rand","live_filter":"cur_post_same_categories","live_filter_cur_post_id":10046,"live_filter_cur_post_author":"694350","block_template_id":""} '; block_td_uid_3_5a236fb03c961.td_column_number = "3"; block_td_uid_3_5a236fb03c961.block_type = "td_block_related_posts"; block_td_uid_3_5a236fb03c961.post_count = "9"; block_td_uid_3_5a236fb03c961.found_posts = "26"; block_td_uid_3_5a236fb03c961.header_color = ""; block_td_uid_3_5a236fb03c961.ajax_pagination_infinite_stop = ""; block_td_uid_3_5a236fb03c961.max_num_pages = "3"; tdBlocksArray.push(block_td_uid_3_5a236fb03c961); </script><h4 class="td-related-title td-block-title"><a id="td_uid_4_5a236fb03e35d" class="td-related-left td-cur-simple-item" data-td_filter_value="" data-td_block_id="td_uid_3_5a236fb03c961" href="#">ARTIGOS SEMELHANTES</a></h4><div id=td_uid_3_5a236fb03c961 class="td_block_inner"> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/garantiya-makbuk-oficialnaya-garantiya-apple-v-rossii-kakie-usloviya-i-kak.html" rel="bookmark" title="Garantia oficial da Apple na Rússia: quais as condições e como verificar"><img width="218" height="150" class="entry-thumb" src="/uploads/d5753cc8af22f6b2c0f2251cf18b2fcd.jpg" alt="Garantia oficial da Apple na Rússia: quais as condições e como verificar" title="Garantia oficial da Apple na Rússia: quais as condições e como verificar"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/windows-8/" class="td-post-category">Windows 8</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/garantiya-makbuk-oficialnaya-garantiya-apple-v-rossii-kakie-usloviya-i-kak.html" rel="bookmark" title="Garantia oficial da Apple na Rússia: quais as condições e como verificar">Garantia oficial da Apple na Rússia: quais as condições e como verificar</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/ne-rabotaet-naushnik-iphone-chto-delat-preimushchestva-obrashcheniya-v-modmac.html" rel="bookmark" title="Fone de ouvido iphone não funciona"><img width="218" height="150" class="entry-thumb" src="/uploads/cabc28bd3982c64f0b66bc197f9f8930.jpg" alt="Fone de ouvido iphone não funciona" title="Fone de ouvido iphone não funciona"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/windows-8/" class="td-post-category">Windows 8</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/ne-rabotaet-naushnik-iphone-chto-delat-preimushchestva-obrashcheniya-v-modmac.html" rel="bookmark" title="Fone de ouvido iphone não funciona">Fone de ouvido iphone não funciona</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/reshenie-problemy-s-mercayushchei-podsvetkoi-na-imac-net-podsvetki-ne-rabotaet.html" rel="bookmark" title="Resolvendo o problema de luz de fundo piscando no iMac"><img width="218" height="150" class="entry-thumb" src="/uploads/d4ec850254dc94d89dfc2c82cffeb46e.jpg" alt="Resolvendo o problema de luz de fundo piscando no iMac" title="Resolvendo o problema de luz de fundo piscando no iMac"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/monitors/" class="td-post-category">Monitores</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/reshenie-problemy-s-mercayushchei-podsvetkoi-na-imac-net-podsvetki-ne-rabotaet.html" rel="bookmark" title="Resolvendo o problema de luz de fundo piscando no iMac">Resolvendo o problema de luz de fundo piscando no iMac</a></h3> </div> </div> </div> </div> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/zamena-stekla-na-ipad-pro-chto-nuzhno-znat-instrumenty-i.html" rel="bookmark" title="Substituição de vidro no iPad Pro"><img width="218" height="150" class="entry-thumb" src="/uploads/e5bae0c6a249ac0c8d49868dfff1b14e.jpg" alt="Substituição de vidro no iPad Pro" title="Substituição de vidro no iPad Pro"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/zamena-stekla-na-ipad-pro-chto-nuzhno-znat-instrumenty-i.html" rel="bookmark" title="Substituição de vidro no iPad Pro">Substituição de vidro no iPad Pro</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/na-makbuke-ne-rabotaet-zvuk-neispravnye-dinamiki-ili-zvukovoi.html" rel="bookmark" title="Alto-falantes ou chip de som com defeito"><img width="218" height="150" class="entry-thumb" src="/uploads/ad5f96707940e9f184a61371202f79ae.jpg" alt="Alto-falantes ou chip de som com defeito" title="Alto-falantes ou chip de som com defeito"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/internet/" class="td-post-category">Internet</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/na-makbuke-ne-rabotaet-zvuk-neispravnye-dinamiki-ili-zvukovoi.html" rel="bookmark" title="Alto-falantes ou chip de som com defeito">Alto-falantes ou chip de som com defeito</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-izmenit-informaciyu-o-kompyutere-mac-os-kak-izmenit-dannye.html" rel="bookmark" title="Como alterar os dados de hardware na seção "Sobre este Mac" para qualquer outro"><img width="218" height="150" class="entry-thumb" src="/uploads/665819b549c2a30d8142138f773fc066.jpg" alt="Como alterar os dados de hardware na seção "Sobre este Mac" para qualquer outro" title="Como alterar os dados de hardware na seção "Sobre este Mac" para qualquer outro"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/more/" class="td-post-category">De outros</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-izmenit-informaciyu-o-kompyutere-mac-os-kak-izmenit-dannye.html" rel="bookmark" title="Como alterar os dados de hardware na seção "Sobre este Mac" para qualquer outro">Como alterar os dados de hardware na seção "Sobre este Mac" para qualquer outro</a></h3> </div> </div> </div> </div> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/imac-ne-vklyuchaetsya-belyi-ekran-ne-zagruzhaetsya-macbook-chto-delat.html" rel="bookmark" title="O MacBook não inicializa: o que fazer"><img width="218" height="150" class="entry-thumb" src="/uploads/03274cad0d413ed979a2f92c00deb66d.jpg" alt="O MacBook não inicializa: o que fazer" title="O MacBook não inicializa: o que fazer"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/case/" class="td-post-category">Carcaças</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/imac-ne-vklyuchaetsya-belyi-ekran-ne-zagruzhaetsya-macbook-chto-delat.html" rel="bookmark" title="O MacBook não inicializa: o que fazer">O MacBook não inicializa: o que fazer</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/aifon-ne-ishchet-set-chto-delat-net-seti-poisk-ili-pochemu-iphone-ne.html" rel="bookmark" title="Sem rede, pesquisa ou por que o iPhone não consegue ver o cartão SIM da operadora"><img width="218" height="150" class="entry-thumb" src="/uploads/24bc2d64ff01f453624f1f90639774e8.jpg" alt="Sem rede, pesquisa ou por que o iPhone não consegue ver o cartão SIM da operadora" title="Sem rede, pesquisa ou por que o iPhone não consegue ver o cartão SIM da operadora"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/aifon-ne-ishchet-set-chto-delat-net-seti-poisk-ili-pochemu-iphone-ne.html" rel="bookmark" title="Sem rede, pesquisa ou por que o iPhone não consegue ver o cartão SIM da operadora">Sem rede, pesquisa ou por que o iPhone não consegue ver o cartão SIM da operadora</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-zamenit-zhestkii-disk-na-makbuke-pro-ustanovka-ssd-i-vtorogo-hdd.html" rel="bookmark" title="Instalando um SSD e um segundo HDD"><img width="218" height="150" class="entry-thumb" src="/uploads/e039ca358bd7d54d5d5c1ee340b39c06.jpg" alt="Instalando um SSD e um segundo HDD" title="Instalando um SSD e um segundo HDD"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/graphics-card/" class="td-post-category">Placas de vídeo</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-zamenit-zhestkii-disk-na-makbuke-pro-ustanovka-ssd-i-vtorogo-hdd.html" rel="bookmark" title="Instalando um SSD e um segundo HDD">Instalando um SSD e um segundo HDD</a></h3> </div> </div> </div> </div></div></div> </div> </div> <div class="td-pb-span4 td-main-sidebar"> <div class="td-ss-main-sidebar"> <aside class="widget �lambda_169101"> <div style="margin:10px 0"> </div> </aside> <div class="td_block_wrap td_block_1 td_block_widget td_uid_2_5a23c04f0cdc0_rand td-pb-border-top td_block_template_1 td-column-1" data-td-block-uid="td_uid_2_5a23c04f0cdc0"> <div class="td-block-title-wrap"> <h4 class="block-title"><span class="td-pulldown-size">Recomendado</span></h4> </div> <div id=td_uid_2_5a23c04f0cdc0 class="td_block_inner"> <div class="td-block-span12"> <div class="td_module_4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/apple-watch-ne-vklyuchaetsya-ne-vklyuchayutsya-apple-watch-chto-delat-nekotorye.html" rel="bookmark" title="O Apple Watch não liga, o que devo fazer?"><img width="324" height="235" class="entry-thumb" src="/uploads/c3a4a61291c8f5e886df861b1d1ad5e1.jpg" alt="O Apple Watch não liga, o que devo fazer?" title="O Apple Watch não liga, o que devo fazer?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/pt/category/windows-8/" class="td-post-category">Windows 8</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/apple-watch-ne-vklyuchaetsya-ne-vklyuchayutsya-apple-watch-chto-delat-nekotorye.html" rel="bookmark" title="O Apple Watch não liga, o que devo fazer?">O Apple Watch não liga, o que devo fazer?</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Apple Watch é o primeiro smartwatch do mercado global. Tendo desenvolvido e melhorado o iPhone, a empresa "apple" inventou um dispositivo único, ...</div> </div> <!-- /next_post --> </div> <div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-otvyazat-apple-watch-ot-icloud-kak-pravilno-otvyazat-iwatch-ot-apple-id-i-icloud.html" rel="bookmark" title="Como desvincular o iWatch do Apple ID e do iCloud corretamente?"><img width="100" height="70" class="entry-thumb" src="/uploads/68c8344ac04951a150d1fdb94d8260e7.jpg" alt="Como desvincular o iWatch do Apple ID e do iCloud corretamente?" title="Como desvincular o iWatch do Apple ID e do iCloud corretamente?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-otvyazat-apple-watch-ot-icloud-kak-pravilno-otvyazat-iwatch-ot-apple-id-i-icloud.html" rel="bookmark" title="Como desvincular o iWatch do Apple ID e do iCloud corretamente?">Como desvincular o iWatch do Apple ID e do iCloud corretamente?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/pt/category/motherboard/" class="td-post-category">placas-mãe</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/pridavili-planshet-vnutri-polosy-chto-delat-esli-na-displee.html" rel="bookmark" title="O que fazer se listras ou ondulações aparecerem na tela do tablet?"><img width="100" height="70" class="entry-thumb" src="/uploads/b4e1f2964337922262a9e58e648daf88.jpg" alt="O que fazer se listras ou ondulações aparecerem na tela do tablet?" title="O que fazer se listras ou ondulações aparecerem na tela do tablet?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/pridavili-planshet-vnutri-polosy-chto-delat-esli-na-displee.html" rel="bookmark" title="O que fazer se listras ou ondulações aparecerem na tela do tablet?">O que fazer se listras ou ondulações aparecerem na tela do tablet?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/pt/category/motherboard/" class="td-post-category">placas-mãe</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/otlozhennyi-start-v-multivarke-kasha-v-multivarke-otlozhennyi-start.html" rel="bookmark" title="Mingau em um fogão lento (início retardado)"><img width="100" height="70" class="entry-thumb" src="/uploads/4d56e6aaeb117739cdbff7b1626f295d.jpg" alt="Mingau em um fogão lento (início retardado)" title="Mingau em um fogão lento (início retardado)"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/otlozhennyi-start-v-multivarke-kasha-v-multivarke-otlozhennyi-start.html" rel="bookmark" title="Mingau em um fogão lento (início retardado)">Mingau em um fogão lento (início retardado)</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/pt/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/deshifrovat-fail-vashi-faily-byli-zashifrovany-chto-delat.html" rel="bookmark" title="Seus arquivos foram criptografados - o que fazer?"><img width="100" height="70" class="entry-thumb" src="/uploads/006f1042efd36b8ed7b1548e70334120.jpg" alt="Seus arquivos foram criptografados - o que fazer?" title="Seus arquivos foram criptografados - o que fazer?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/deshifrovat-fail-vashi-faily-byli-zashifrovany-chto-delat.html" rel="bookmark" title="Seus arquivos foram criptografados - o que fazer?">Seus arquivos foram criptografados - o que fazer?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/pt/category/more/" class="td-post-category">De outros</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-ubrat-nadpis-ob-aktivacii-cherez-reestr-avtomaticheskaya.html" rel="bookmark" title="Ativação automática da janela ao passar o mouse no Windows Desative as notificações alterando as configurações dos parâmetros"><img width="100" height="70" class="entry-thumb" src="/uploads/fcb4dee4f5cac89cce1adc569aac0a2a.jpg" alt="Ativação automática da janela ao passar o mouse no Windows Desative as notificações alterando as configurações dos parâmetros" title="Ativação automática da janela ao passar o mouse no Windows Desative as notificações alterando as configurações dos parâmetros"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-ubrat-nadpis-ob-aktivacii-cherez-reestr-avtomaticheskaya.html" rel="bookmark" title="Ativação automática da janela ao passar o mouse no Windows Desative as notificações alterando as configurações dos parâmetros">Ativação automática da janela ao passar o mouse no Windows Desative as notificações alterando as configurações dos parâmetros</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/pt/category/windows-7/" class="td-post-category">Windows 7</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/sozdanie-brauzera-dlya-android-kak-izmenit-brauzer-po-umolchaniyu-v.html" rel="bookmark" title="Como alterar o navegador padrão no Android"><img width="100" height="70" class="entry-thumb" src="/uploads/b3b330d3ea68af8d0db3152bfa47a597.jpg" alt="Como alterar o navegador padrão no Android" title="Como alterar o navegador padrão no Android"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/sozdanie-brauzera-dlya-android-kak-izmenit-brauzer-po-umolchaniyu-v.html" rel="bookmark" title="Como alterar o navegador padrão no Android">Como alterar o navegador padrão no Android</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/pt/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> </div> </div> </div> </div> </div> </div> <aside class="widget_text td_block_template_1 widget widget_custom_html"> <div class="textwidget custom-html-widget"> </div> </aside> </div> </div> </div> </div> </div> <div class="td-footer-wrapper td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span12"> </div> </div> <div class="td-pb-row"> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_11_5a23980e76adb_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_11_5a23980e76adb" > <div class="td-block-title-wrap"></div><div id=td_uid_11_5a23980e76adb class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/sar-izluchenie-tablica-nazvany-samye-opasnye-v-mire-smartfony.html" rel="bookmark" title="Os smartphones mais perigosos do mundo são nomeados"><img width="218" height="150" class="entry-thumb" src="/uploads/cf3ee692f5e26d3e2e75be9fbd51cc7a.jpg" alt="Os smartphones mais perigosos do mundo são nomeados" title="Os smartphones mais perigosos do mundo são nomeados"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/sar-izluchenie-tablica-nazvany-samye-opasnye-v-mire-smartfony.html" rel="bookmark" title="Os smartphones mais perigosos do mundo são nomeados">Os smartphones mais perigosos do mundo são nomeados</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/png-chto-za-format-izobrazhenie-v-formate-png-kak-otkryt-redaktirovat-i.html" rel="bookmark" title="Imagem PNG - como abrir, editar e converter um arquivo"><img width="218" height="150" class="entry-thumb" src="/uploads/808a93b745afc7d3f18755e37388ec83.jpg" alt="Imagem PNG - como abrir, editar e converter um arquivo" title="Imagem PNG - como abrir, editar e converter um arquivo"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/png-chto-za-format-izobrazhenie-v-formate-png-kak-otkryt-redaktirovat-i.html" rel="bookmark" title="Imagem PNG - como abrir, editar e converter um arquivo">Imagem PNG - como abrir, editar e converter um arquivo</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-otskanirovat-staruyu-fotografiyu-skanirovanie-staryh.html" rel="bookmark" title="Digitalizando fotos antigas"><img width="218" height="150" class="entry-thumb" src="/uploads/1ac7ddb44b99fd754ea64657c4f19d72.jpg" alt="Digitalizando fotos antigas" title="Digitalizando fotos antigas"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-otskanirovat-staruyu-fotografiyu-skanirovanie-staryh.html" rel="bookmark" title="Digitalizando fotos antigas">Digitalizando fotos antigas</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-otkryt-fail-mvk-chem-mozhno-otkryt-mkv-fail-na-windows-ot-skromnyh-nachinanii.html" rel="bookmark" title="Como você pode abrir um arquivo MKV no Windows?"><img width="218" height="150" class="entry-thumb" src="/uploads/c945ceab6c4adc854f21a9ba4a281ae2.jpg" alt="Como você pode abrir um arquivo MKV no Windows?" title="Como você pode abrir um arquivo MKV no Windows?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-otkryt-fail-mvk-chem-mozhno-otkryt-mkv-fail-na-windows-ot-skromnyh-nachinanii.html" rel="bookmark" title="Como você pode abrir um arquivo MKV no Windows?">Como você pode abrir um arquivo MKV no Windows?</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kompas-3d-studencheskaya-versiya-besplatnye-uchebnye-versii.html" rel="bookmark" title="Versões educacionais gratuitas"><img width="218" height="150" class="entry-thumb" src="/uploads/76046a07bfc216d50adfbf3ed560231c.jpg" alt="Versões educacionais gratuitas" title="Versões educacionais gratuitas"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kompas-3d-studencheskaya-versiya-besplatnye-uchebnye-versii.html" rel="bookmark" title="Versões educacionais gratuitas">Versões educacionais gratuitas</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/programma-dlya-massovoi-obrezki-fotografii-paketnaya.html" rel="bookmark" title="Software de recorte de fotos em massa"><img width="218" height="150" class="entry-thumb" src="/uploads/0f2370c74360bc150ee3d18b14f3a30b.jpg" alt="Software de recorte de fotos em massa" title="Software de recorte de fotos em massa"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/programma-dlya-massovoi-obrezki-fotografii-paketnaya.html" rel="bookmark" title="Software de recorte de fotos em massa">Software de recorte de fotos em massa</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div> </div> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_12_5a23980e79990_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_12_5a23980e79990" > <div class="td-block-title-wrap"></div><div id=td_uid_12_5a23980e79990 class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/skachivaem-bez-ogranichenii-s-turbobit-net-failoobmennik-turbobit.html" rel="bookmark" title="Baixe sem restrições da rede turbobit"><img width="218" height="150" class="entry-thumb" src="/uploads/545f7c2cf0d40fd39283a67f2b168d6a.jpg" alt="Baixe sem restrições da rede turbobit" title="Baixe sem restrições da rede turbobit"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/skachivaem-bez-ogranichenii-s-turbobit-net-failoobmennik-turbobit.html" rel="bookmark" title="Baixe sem restrições da rede turbobit">Baixe sem restrições da rede turbobit</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/programma-sozdanie-shem-vyshivki-krestom-iz-fotografii.html" rel="bookmark" title="Programas para costura cruzada e criação de padrões"><img width="218" height="150" class="entry-thumb" src="/uploads/ed8e2e2fdcfe4feb4220f717e52f0f00.jpg" alt="Programas para costura cruzada e criação de padrões" title="Programas para costura cruzada e criação de padrões"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/programma-sozdanie-shem-vyshivki-krestom-iz-fotografii.html" rel="bookmark" title="Programas para costura cruzada e criação de padrões">Programas para costura cruzada e criação de padrões</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/ustanovka-wifi-programma-dlya-vindovs-programmy-dlya-razdachi-wifi.html" rel="bookmark" title="Programas para distribuição de WiFi de um laptop"><img width="218" height="150" class="entry-thumb" src="/uploads/46db09359a00bb0e5df950e2bd6a10e6.jpg" alt="Programas para distribuição de WiFi de um laptop" title="Programas para distribuição de WiFi de um laptop"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/ustanovka-wifi-programma-dlya-vindovs-programmy-dlya-razdachi-wifi.html" rel="bookmark" title="Programas para distribuição de WiFi de um laptop">Programas para distribuição de WiFi de um laptop</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/sozdanie-cms-etap-proektirovaniya-ot-teorii-do-sobstvennoi-cms.html" rel="bookmark" title="Da teoria à sua própria loja online CMS O que é melhor: pago ou gratuito"><img width="218" height="150" class="entry-thumb" src="/uploads/37a7bc0e71d0a5cec163915dbfcf0580.jpg" alt="Da teoria à sua própria loja online CMS O que é melhor: pago ou gratuito" title="Da teoria à sua própria loja online CMS O que é melhor: pago ou gratuito"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/sozdanie-cms-etap-proektirovaniya-ot-teorii-do-sobstvennoi-cms.html" rel="bookmark" title="Da teoria à sua própria loja online CMS O que é melhor: pago ou gratuito">Da teoria à sua própria loja online CMS O que é melhor: pago ou gratuito</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-udalyat-prilozheniya-iz-miui-kak-udalit-sistemnye-prilozheniya-na-xiaomi-bez.html" rel="bookmark" title="Como desinstalar aplicativos do sistema no Xiaomi sem root Removendo aplicativos miui"><img width="218" height="150" class="entry-thumb" src="/uploads/f711801ac85f8bd826dfb0fb1e3bdf3d.jpg" alt="Como desinstalar aplicativos do sistema no Xiaomi sem root Removendo aplicativos miui" title="Como desinstalar aplicativos do sistema no Xiaomi sem root Removendo aplicativos miui"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-udalyat-prilozheniya-iz-miui-kak-udalit-sistemnye-prilozheniya-na-xiaomi-bez.html" rel="bookmark" title="Como desinstalar aplicativos do sistema no Xiaomi sem root Removendo aplicativos miui">Como desinstalar aplicativos do sistema no Xiaomi sem root Removendo aplicativos miui</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/kak-zablokirovat-ekran-kompyutera-s-pomoshchyu-klaviatury-raznye.html" rel="bookmark" title="Diferentes maneiras de bloquear o teclado em um laptop"><img width="218" height="150" class="entry-thumb" src="/uploads/f82d25d1c813cc5d4c4ad61273bcd355.jpg" alt="Diferentes maneiras de bloquear o teclado em um laptop" title="Diferentes maneiras de bloquear o teclado em um laptop"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/kak-zablokirovat-ekran-kompyutera-s-pomoshchyu-klaviatury-raznye.html" rel="bookmark" title="Diferentes maneiras de bloquear o teclado em um laptop">Diferentes maneiras de bloquear o teclado em um laptop</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div> </div> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_13_5a23980e7caa8_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_13_5a23980e7caa8" > <div class="td-block-title-wrap"></div><div id=td_uid_13_5a23980e7caa8 class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/algoritmy-cifrovoi-filtracii-signalov-postroennye-na-baze.html" rel="bookmark" title="Algoritmos para filtragem digital de sinais pelo método de média e pesquisa da eficiência do seu trabalho Gravação de sinais digitais e algoritmos de filtragem"><img width="218" height="150" class="entry-thumb" src="/uploads/7574cc36365ba5854a04404ae359fc36.jpg" alt="Algoritmos para filtragem digital de sinais pelo método de média e pesquisa da eficiência do seu trabalho Gravação de sinais digitais e algoritmos de filtragem" title="Algoritmos para filtragem digital de sinais pelo método de média e pesquisa da eficiência do seu trabalho Gravação de sinais digitais e algoritmos de filtragem"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/algoritmy-cifrovoi-filtracii-signalov-postroennye-na-baze.html" rel="bookmark" title="Algoritmos para filtragem digital de sinais pelo método de média e pesquisa da eficiência do seu trabalho Gravação de sinais digitais e algoritmos de filtragem">Algoritmos para filtragem digital de sinais pelo método de média e pesquisa da eficiência do seu trabalho Gravação de sinais digitais e algoritmos de filtragem</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/beta-raspredelenie-sluchainoi-velichiny-beta-raspredelenie.html" rel="bookmark" title="Distribuição beta de uma variável aleatória"><img width="218" height="150" class="entry-thumb" src="/uploads/4f029f8c2aea4010ce5f53bcc6ad0414.jpg" alt="Distribuição beta de uma variável aleatória" title="Distribuição beta de uma variável aleatória"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/beta-raspredelenie-sluchainoi-velichiny-beta-raspredelenie.html" rel="bookmark" title="Distribuição beta de uma variável aleatória">Distribuição beta de uma variável aleatória</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/preobrazovanie-laplasa-osnovnye-opredeleniya-svoistva-formula.html" rel="bookmark" title="Notas da aula: A essência da transformação de Laplace A história da variável complexa Laplace"><img width="218" height="150" class="entry-thumb" src="/uploads/eefaa524903a720136b3646d3b1410c0.jpg" alt="Notas da aula: A essência da transformação de Laplace A história da variável complexa Laplace" title="Notas da aula: A essência da transformação de Laplace A história da variável complexa Laplace"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/preobrazovanie-laplasa-osnovnye-opredeleniya-svoistva-formula.html" rel="bookmark" title="Notas da aula: A essência da transformação de Laplace A história da variável complexa Laplace">Notas da aula: A essência da transformação de Laplace A história da variável complexa Laplace</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/perehodnye-i-impulsnye-harakteristiki-rl-cepi-perehodnaya-i.html" rel="bookmark" title="Resposta transitória e de impulso"><img width="218" height="150" class="entry-thumb" src="/uploads/12ee1f7ed39a26a762c9095d09eaf90d.jpg" alt="Resposta transitória e de impulso" title="Resposta transitória e de impulso"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/perehodnye-i-impulsnye-harakteristiki-rl-cepi-perehodnaya-i.html" rel="bookmark" title="Resposta transitória e de impulso">Resposta transitória e de impulso</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/elementy-teorii-sinteza-lineinyh-chastotnyh-filtrov-nikonov-i.html" rel="bookmark" title="Elementos da teoria de síntese de filtros de frequência linear"><img width="218" height="150" class="entry-thumb" src="/uploads/3bd9713d43002d2cd36d5c181eb4545f.jpg" alt="Elementos da teoria de síntese de filtros de frequência linear" title="Elementos da teoria de síntese de filtros de frequência linear"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/elementy-teorii-sinteza-lineinyh-chastotnyh-filtrov-nikonov-i.html" rel="bookmark" title="Elementos da teoria de síntese de filtros de frequência linear">Elementos da teoria de síntese de filtros de frequência linear</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/pt/rangovaya-korrelyaciya-i-koefficient-rangovoi-korrelyacii-kendalla-koefficienty.html" rel="bookmark" title="Coeficientes de correlação de classificação de Kendall e Spearman Fórmula do coeficiente de correlação de Kendall"><img width="218" height="150" class="entry-thumb" src="/uploads/44c1f54edff8260861d28a025281d468.jpg" alt="Coeficientes de correlação de classificação de Kendall e Spearman Fórmula do coeficiente de correlação de Kendall" title="Coeficientes de correlação de classificação de Kendall e Spearman Fórmula do coeficiente de correlação de Kendall"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/pt/rangovaya-korrelyaciya-i-koefficient-rangovoi-korrelyacii-kendalla-koefficienty.html" rel="bookmark" title="Coeficientes de correlação de classificação de Kendall e Spearman Fórmula do coeficiente de correlação de Kendall">Coeficientes de correlação de classificação de Kendall e Spearman Fórmula do coeficiente de correlação de Kendall</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside> </div> </div> </div> </div> <div class="td-sub-footer-container td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span td-sub-footer-menu"> </div> <div class="td-pb-span td-sub-footer-copy">Copyright 2021 - Reparos de Computadores e Portáteis. Placas de vídeo, discos rígidos, internet, monitores.</div> </div> </div> </div> </div> <style type="text/css" media="screen"> /* custom css theme panel */ .td-post-header .entry-title { font-weight: normal !important; } h1.entry-title { font-weight: normal !important; border-bottom:#c44c4c 2px dotted; } h1.entry-title:before { content: "\f184"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .sf-menu ul .td-menu-item > a:hover, .sf-menu ul .sfHover > a, .sf-menu ul .current-menu-ancestor > a, .sf-menu ul .current-category-ancestor > a, .sf-menu ul .current-menu-item > a { color: #edf3f7; } .td-post-content h2 { border-bottom:#c44c4c 2px dotted;} .td-post-content h2:before { content: "\f184"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-post-content h3 { border-bottom:#c44c4c 2px dotted;} .td-post-content h3:before { content: "\f103"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .category-my .td-page-title { color:#c44c4c; font-weight: 400; font-size: 36px; } .post header .entry-title { line-height: 40px; } .td-category-description h2, .td-category-description h3 { color:#c44c4c;} .td-category-description h2 { border-bottom:#c44c4c 2px solid;} .td-category-description h2:before { content: "\f055"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-category-description h3 { border-bottom:#c44c4c 2px solid;} .td-category-description h3:before { content: "\f103"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-category-description ol, .td-category-description ul { margin-top:20px !important; margin-bottom:20px !important;} .td-category-description ul, .td-post-content ul { padding:0; margin:0; list-style:none; clear:both;} .td-category-description ul li, .td-post-content ul li { padding:0 0 0 15px; margin:0 0 10px 35px; position:relative;} .td-category-description ul li:before, .td-post-content ul li:before { content: "\f192"; font-family: "FontAwesome"; color:#c44c4c; position:absolute; left:-10px;} .td-category-description ol, .td-post-content ol { padding:0; margin:0 0 0 5px; list-style:none; counter-reset: lipoint; clear:both;} .td-category-description ol li, .td-post-content ol li { padding:0 0 0 15px; margin:0 0 10px 35px; position:relative;} .td-category-description ol li:before, .td-post-content ol li:before { content: counter(lipoint); counter-increment: lipoint; color:#fff; position:absolute; left:-16px; background:#c44c4c; width:20px; height:20px; line-height:20px; text-align:center; -webkit-border-radius: 20px;border-radius: 20px; font-size:12px; top:3px;} .toc_list li:before { display:none} .td-header-style-9 .td-header-menu-wrap-full { /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#c44c4c+0,c10000+100 */ background: #c44c4c; /* Old browsers */ background: -moz-linear-gradient(top, #c44c4c 0%, #c10000 100%); /* FF3.6-15 */ background: -webkit-linear-gradient(top, #c44c4c 0%,#c10000 100%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to bottom, #c44c4c 0%,#c10000 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c44c4c', endColorstr='#c10000',GradientType=0 ); /* IE6-9 */ } .sf-menu > li > a { color: #fff; } .td-header-style-9 .header-search-wrap .td-icon-search { color: #fff; } .td-affix a { color:#000 !important;} </style> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1"} ; /* ]]> */ </script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/table-of-contents-plus/front.min.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/wp-postratings/js/postratings-js.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/themes/Newspaper/js/tagdiv_theme.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var boxzilla_options = { "testMode":"","boxes":[]} ; /* ]]> */ </script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/boxzilla/assets/js/script.min.js'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/client/js/prod/lib.core.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/client/js/prod/lib.view.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/themes/baseline/js/prod/client.js'></script> <script type='text/javascript' src='/assets/client1.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/template-tags/item/js/prod/tag.item.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/template-tags/ui/js/prod/tag.ui.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/content-handlers/image/js/prod/handler.image.js'></script> <script> (function(){ var html_jquery_obj = jQuery('html'); if (html_jquery_obj.length && (html_jquery_obj.is('.ie8') || html_jquery_obj.is('.ie9'))) { var path = '/wp-content/themes/Newspaper/style.css'; jQuery.get(path, function(data) { var str_split_separator = '#td_css_split_separator'; var arr_splits = data.split(str_split_separator); var arr_length = arr_splits.length; if (arr_length > 1) { var dir_path = '/wp-content/themes/Newspaper'; var splited_css = ''; for (var i = 0; i < arr_length; i++) { if (i > 0) { arr_splits[i] = str_split_separator + ' ' + arr_splits[i]; } //jQuery('head').append('<style>' + arr_splits[i] + '</style>'); var formated_str = arr_splits[i].replace(/\surl\(\'(?!data\:)/gi, function regex_function(str) { return ' url(\'' + dir_path + '/' + str.replace(/url\(\'/gi, '').replace(/^\s+|\s+$/gm,''); } ); splited_css += "<style>" + formated_str + "</style>"; } var td_theme_css = jQuery('link#td-theme-css'); if (td_theme_css.length) { td_theme_css.after(splited_css); } } } ); } } )(); </script> </body> </html>