{"id":11387,"date":"2021-07-23T04:43:54","date_gmt":"2021-07-23T11:43:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=11387"},"modified":"2025-06-13T22:39:21","modified_gmt":"2025-06-14T05:39:21","slug":"how-to-use-couchbase-xml-database","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/how-to-use-couchbase-xml-database\/","title":{"rendered":"Como (e por que) usar o Couchbase como um banco de dados XML"},"content":{"rendered":"<h2>Couchbase e XML - sem problemas!<\/h2>\n<p><strong>J\u00e1 ouvi essa frase dezenas de vezes:<\/strong> \"Ei, o Couchbase \u00e9 \u00f3timo, mas eu uso XML.\"<\/p>\n<p>Reconhe\u00e7o que, ao responder com \"Couchbase <em>pode<\/em> seja seu banco de dados XML\" \u00e9 bastante ousado, especialmente para um banco de dados de documentos orientado para JSON. Algumas pessoas da comunidade do Couchbase podem at\u00e9 mesmo pensar duas vezes, mas espero que voc\u00ea entenda o que quero dizer at\u00e9 o final desta publica\u00e7\u00e3o.<\/p>\n<p>\u00c9 um fato que muitos aplicativos legados ainda dependem de XML, mas ser\u00e1 que o Couchbase \u00e9 realmente a solu\u00e7\u00e3o certa para armazenar e processar seus dados XML? N\u00e3o se preocupe: com rela\u00e7\u00e3o ao Couchbase e ao XML, voc\u00ea pode ter seu bolo e com\u00ea-lo tamb\u00e9m.<\/p>\n<p>Depois de apresentar alguns conceitos, este artigo mostra como converter autom\u00e1tica e instantaneamente XML em equivalentes JSON no Couchbase com quase nenhum esfor\u00e7o - tudo por meio de uma fun\u00e7\u00e3o Eventing. Se voc\u00ea pensar em JSON como o formato intermedi\u00e1rio de computador usado para armazenar seu XML, talvez j\u00e1 tenha percebido onde quero chegar.<\/p>\n<p>Ao transformar seus dados XML em uma representa\u00e7\u00e3o JSON nativa, voc\u00ea aproveita o rico ecossistema de servi\u00e7os do Couchbase, incluindo <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/n1ql\/?ref=blog\" target=\"_blank\" rel=\"noopener\">N1QL<\/a>, Indexa\u00e7\u00e3o, <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/full-text-search\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Pesquisa de texto completo<\/a>, <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/eventing\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Eventos<\/a>e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/analytics\/?ref=blog\" target=\"_blank\" rel=\"noopener\">An\u00e1lises<\/a>.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/capella\/\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a> \u00e9 um banco de dados criado especificamente para ser montado de acordo com suas necessidades. Precisa apenas de um cache r\u00e1pido? Voc\u00ea s\u00f3 precisa do Data Service ou do armazenamento de valores-chave. Deseja acesso semelhante ao SQL? Adicione os servi\u00e7os Query e Index. Ou talvez voc\u00ea precise de Analytics ou Full-Text Search? Basta adicionar alguns n\u00f3s do tipo adequado.<\/p>\n<p>Cada um dos servi\u00e7os acima \u00e9 dimensionado de forma independente para que voc\u00ea acabe construindo - e, o que \u00e9 mais importante, construindo, <em>pagando por<\/em> - apenas o que voc\u00ea precisa. No artigo abaixo, uso o Eventing para transformar o Couchbase em um banco de dados compat\u00edvel com XML. Sei que isso parece bom demais para ser verdade, mas acredite, realmente funciona.<\/p>\n<p><em>Se voc\u00ea estiver familiarizado com Couchbase, XML e JSON, sinta-se \u00e0 vontade para <a href=\"#prereq\">V\u00e1 para a se\u00e7\u00e3o Pr\u00e9-requisitos<\/a>.<\/em><\/p>\n<h2>O modelo de dados do Couchbase<\/h2>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/server\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a> \u00e9 uma plataforma de dados distribu\u00edda e de c\u00f3digo aberto. Ela armazena dados como <em>itens<\/em>cada um dos quais tem um <em>chave<\/em> e um <em>valor<\/em>. As opera\u00e7\u00f5es de dados em menos de um milissegundo s\u00e3o fornecidas por servi\u00e7os avan\u00e7ados de consulta e indexa\u00e7\u00e3o, al\u00e9m de uma linguagem de consulta rica em recursos e orientada a documentos, <em>N1QL<\/em>. V\u00e1rias inst\u00e2ncias do Couchbase Server podem ser combinadas em uma \u00fanica <em>agrupamento<\/em>.<\/p>\n<h3>Chaves<\/h3>\n<p>Cada valor (bin\u00e1rio ou JSON) \u00e9 identificado por uma chave exclusiva, definida pelo usu\u00e1rio ou aplicativo quando o item \u00e9 salvo. A chave \u00e9 imut\u00e1vel: depois que o item \u00e9 salvo, a chave n\u00e3o pode ser alterada. Observe que o Couchbase tamb\u00e9m se refere \u00e0 chave de um item como seu <em>id<\/em>.<\/p>\n<p>Cada chave:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Deve ser uma cadeia de caracteres UTF-8 sem espa\u00e7os. Caracteres especiais, como <code>(<\/code>, <code>%<\/code>, <code>\/<\/code>, <code>\"<\/code> e <code>_<\/code> s\u00e3o aceit\u00e1veis.<\/li>\n<li>N\u00e3o pode ter mais de 250 bytes.<\/li>\n<li>Deve ser exclusivo em seu intervalo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>Valores<\/h3>\n<p>O tamanho m\u00e1ximo de um valor \u00e9 de 20 MiB. Um valor pode ser:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>Bin\u00e1rio:<\/strong> Qualquer forma de bin\u00e1rio \u00e9 aceit\u00e1vel. Observe que um valor bin\u00e1rio n\u00e3o pode ser analisado, indexado ou consultado. Ele s\u00f3 pode ser recuperado pela chave.<\/li>\n<li><strong>JSON:<\/strong> Um valor JSON, chamado de <em>documento<\/em>pode ser analisado, indexado e consultado. Cada documento consiste em um ou mais atributos, cada um dos quais tem seu pr\u00f3prio valor. O valor de um atributo pode ser um tipo b\u00e1sico, como um n\u00famero, uma cadeia de caracteres ou um booleano, ou um tipo complexo, como um documento incorporado ou uma matriz.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>JSON \u00e9 o banco de dados<\/h3>\n<p>Vamos falar mais sobre JSON. Voc\u00ea pode analisar, indexar, consultar e manipular documentos JSON. De fato, o Couchbase introduziu a linguagem de consulta N1QL (pronuncia-se \"nickel\") para atender \u00e0s necessidades de consulta de bancos de dados distribu\u00eddos orientados a documentos. A N1QL \u00e9 usada para manipular os dados JSON no Couchbase, assim como o SQL manipula os dados em um banco de dados relacional (RDBMS). Ele tem <code>SELECIONAR<\/code>, <code>INSERIR<\/code>, <code>ATUALIZA\u00c7\u00c3O<\/code>, <code>DELETE<\/code> e <code>MERGE<\/code> para operar em dados JSON.<\/p>\n<p>Voc\u00ea poderia armazenar XML como uma string ou apenas um blob bin\u00e1rio, mas onde est\u00e1 a divers\u00e3o - ou a utilidade - nisso? Por que n\u00e3o converter automaticamente seu XML em JSON? Ainda bem que voc\u00ea perguntou.<\/p>\n<h3>XML: Extensible Markup Language (Linguagem de Marca\u00e7\u00e3o Extens\u00edvel)<\/h3>\n<p>XML \u00e9 uma linguagem de marca\u00e7\u00e3o introduzida em 1996 que define um conjunto de regras para a codifica\u00e7\u00e3o de documentos em um formato que pode ser lido por humanos e por m\u00e1quinas. \u00c9 uma recomenda\u00e7\u00e3o do World Wide Web Consortium (W3C).<\/p>\n<p>As metas de design do XML enfatizam a simplicidade, a generalidade e a facilidade de uso na Internet. \u00c9 um formato de dados textuais com forte suporte via Unicode para diferentes idiomas humanos. Embora o design do XML se concentre em documentos, a linguagem \u00e9 amplamente usada para a representa\u00e7\u00e3o de estruturas de dados arbitr\u00e1rias, como as usadas em servi\u00e7os da Web.<\/p>\n<p>Aqui est\u00e1 um exemplo de XML:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">&lt;CD&gt;\r\n  &lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;\r\n  &lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;\r\n  &lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;\r\n  &lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;\r\n  &lt;PRICE&gt;10.90&lt;\/PRICE&gt;\r\n  &lt;YEAR&gt;1985&lt;\/YEAR&gt;\r\n&lt;\/CD&gt;\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>JSON: Nota\u00e7\u00e3o de objeto JavaScript<\/h3>\n<p>Criado por volta de 2001, o JSON \u00e9 um formato de arquivo padr\u00e3o aberto bastante leve e um formato de interc\u00e2mbio de dados que usa texto leg\u00edvel por humanos para armazenar e transmitir objetos de dados que consistem em pares atributo-valor e matrizes (ou outros valores serializ\u00e1veis).<\/p>\n<p>O JSON \u00e9 um formato de dados muito comum, com uma grande variedade de aplica\u00e7\u00f5es, como, por exemplo, aplicativos da Web que se comunicam com um servidor.<\/p>\n<p>Aqui est\u00e1 um exemplo de JSON:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">{\r\n  \"email\": \"testme@example.org\",\r\n  \"friends\": [\r\n    {\"name\": \"rick\"},\r\n    {\"name\": \"cate\"}\r\n  ]\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>O JSON dominou o mundo<\/h3>\n<p>Atualmente, quando dois aplicativos se comunicam entre si pela Internet, \u00e9 prov\u00e1vel que o fa\u00e7am usando JSON, especialmente se se comunicarem em texto leg\u00edvel por humanos.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" title=\"Ado\u00e7\u00e3o do JSON\" src=\"https:\/\/twobithistory.org\/images\/json.svg\" alt=\"JSON vs XML adoption\" width=\"660\" height=\"400\" \/><\/p>\n<p>Se voc\u00ea \u00e9 um f\u00e3 de XML, n\u00e3o atire no mensageiro aqui. Tenho certeza de que o XML nunca desaparecer\u00e1, assim como o HTML como linguagem de marca\u00e7\u00e3o, mas gosto de pensar que as estat\u00edsticas n\u00e3o mentem quando se trata de desenvolver aplicativos da Internet que precisam se comunicar uns com os outros.<\/p>\n<h2 id=\"prereq\">Pr\u00e9-requisitos: Aprendendo sobre eventos<\/h2>\n<p>Neste artigo, usaremos a vers\u00e3o mais recente do Couchbase - vers\u00e3o 6.6.2 -, mas ela tamb\u00e9m deve funcionar bem em vers\u00f5es anteriores.<\/p>\n<p>Se voc\u00ea n\u00e3o estiver familiarizado com o Couchbase ou com o servi\u00e7o Eventing, consulte os recursos a seguir, incluindo pelo menos um exemplo de Eventing:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/getting-started\/start-here.html?ref=blog\" target=\"_blank\" rel=\"noopener\">Configurar um servidor Couchbase 6.6.2 funcional<\/a> de acordo com as instru\u00e7\u00f5es em \"Comece aqui!\"<\/li>\n<li>Entenda como implementar uma fun\u00e7\u00e3o b\u00e1sica de Eventing como <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-example-data-enrichment.html?ref=blog\" target=\"_blank\" rel=\"noopener\">de acordo com as instru\u00e7\u00f5es do exemplo de enriquecimento de dados<\/a>. Observe o \"Caso 2\", em que usaremos apenas o compartimento de \"origem\".<\/li>\n<li>Certifique-se de que voc\u00ea tenha um <strong>fonte<\/strong> de pelo menos 100 MB na visualiza\u00e7\u00e3o de Buckets da interface do usu\u00e1rio.<\/li>\n<li>Certifique-se de que voc\u00ea tenha um balde chamado <strong>metadados<\/strong> de pelo menos 100 MB na visualiza\u00e7\u00e3o de Buckets da interface do usu\u00e1rio.<\/li>\n<li>Consulte a documenta\u00e7\u00e3o de <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/manage\/manage-buckets\/create-bucket.html?ref=blog\" target=\"_blank\" rel=\"noopener\">etapas detalhadas sobre como criar um bucket<\/a>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Inser\u00e7\u00e3o de XML no Couchbase<\/h2>\n<p>Agora voc\u00ea deve ter um aplicativo que carrega dados, ou pode ter usado <code>cbimport<\/code> para carregar seus dados XML em seu cluster do Couchbase.<\/p>\n<p>No c\u00f3digo abaixo, carrego meu primeiro documento com um <em>chave<\/em> <code>xml::1<\/code> e um <em>corpo<\/em> consistindo em um <code>tipo<\/code> e o <code>id<\/code> usado na chave (esses valores s\u00e3o opcionais, mas \u00fateis) e, por fim, uma propriedade <code>in_xml<\/code> que cont\u00e9m a pr\u00f3pria string XML.<\/p>\n<pre class=\"toolbar-overlay:false wrap:true lang:default decode:true\">{\r\n  \"type\": \"xml\",\r\n  \"id\": 1,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\"\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>N\u00e3o podemos fazer muita coisa com a string XML acima. Claro, poder\u00edamos indexar a propriedade <code>in_xml<\/code> como uma cadeia de caracteres, mas n\u00e3o obteremos muito desempenho ao fazer isso, a menos que usemos uma pesquisa de prefixo, que, na minha humilde opini\u00e3o, provavelmente n\u00e3o vale a pena.<\/p>\n<p>Poder\u00edamos pass\u00e1-lo para o produto Full-Text Search (FTS). Nesse caso, voc\u00ea obteria mais utilidade, mas teria que indexar toda a carga \u00fatil do XML (n\u00e3o apenas algo importante).<\/p>\n<p>O que realmente queremos \u00e9 a representa\u00e7\u00e3o JSON da propriedade de string XML <code>in_xml<\/code>Talvez algo como:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">\"out_json\": {\r\n  \"CD\": {\r\n    \"TITLE\": \"EmpireBurlesque\",\r\n    \"ARTIST\": \"BobDylan\",\r\n    \"COUNTRY\": \"USA\",\r\n    \"COMPANY\": \"Columbia\",\r\n    \"PRICE\": \"10.90\",\r\n    \"YEAR\": \"1985\"\r\n  }\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Usando a nova propriedade <code>out_json<\/code>Agora, vemos propriedades JSON individuais em uma estrutura adequada: algo com o qual N1QL, indexa\u00e7\u00e3o, FTS (Full-Text Search), Eventing e Analytics trabalham de forma nativa e eficiente.<\/p>\n<p>Com essas etapas preliminares conclu\u00eddas, voc\u00ea pode pensar em analisar seus dados e transform\u00e1-los em JSON antes de coloc\u00e1-los no Couchbase. Mas a desvantagem \u00e9 que agora temos mais bagagem para carregar e mais infraestrutura (fora do Couchbase) para implantar \u00e0 medida que aumentamos a escala adicionando mais n\u00f3s.<\/p>\n<p>Se pudermos evitar, n\u00e3o queremos escrever um analisador personalizado. Isso n\u00e3o \u00e9 divertido e \u00e9 dif\u00edcil de manter, pois seus requisitos e formatos de dados mudam com o tempo.<\/p>\n<p>O ideal \u00e9 que voc\u00ea queira uma solu\u00e7\u00e3o no servidor que converta genericamente XML em JSON em tempo real, sem impacto nos carregadores de dados.<\/p>\n<h2>Convers\u00e3o de XML para JSON em tempo real<\/h2>\n<p>Entre no Eventing Service do Couchbase.<\/p>\n<p>Pense em Eventing como um \"gatilho posterior\" em um documento que responde a cada altera\u00e7\u00e3o (ou muta\u00e7\u00e3o) em seus dados. A ideia principal \u00e9 que sempre que voc\u00ea inserir ou atualizar seu documento (consulte <code>xml::1<\/code> acima), um pequeno fragmento de JavaScript, ou lambda, \u00e9 executado no documento e encapsula a l\u00f3gica comercial necess\u00e1ria para manipular o documento e garantir que ele esteja no formato desejado.<\/p>\n<p>Nesse caso, queremos converter um documento como o que est\u00e1 abaixo:<\/p>\n<pre class=\"toolbar-overlay:false wrap:true lang:default decode:true\">{\r\n  \"type\": \"xml\",\r\n  \"id\": 1,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\"\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Em tempo real, queremos converter o documento acima em um documento enriquecido como o abaixo:<\/p>\n<pre class=\"toolbar-overlay:false wrap:true lang:js decode:true\">{\r\n  \"type\": \"xml\",\r\n  \"id\": 2,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\",\r\n  \"out_json\": {\r\n    \"CD\": {\r\n      \"TITLE\": \"EmpireBurlesque\",\r\n      \"ARTIST\": \"BobDylan\",\r\n      \"COUNTRY\": \"USA\",\r\n      \"COMPANY\": \"Columbia\",\r\n      \"PRICE\": \"10.90\",\r\n      \"YEAR\": \"1985\"\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>O documento enriquecido mostrado acima pode ser pesquisado por meio de valor-chave ou por meio de um \u00edndice em qualquer campo espec\u00edfico usando N1QL.<\/p>\n<p>Como antes, vemos propriedades JSON individuais em uma estrutura adequada, mas sob o <code>out_json<\/code> que permite o uso eficiente de FTS (Full-Text Search), Analytics e at\u00e9 mesmo outras fun\u00e7\u00f5es de Eventing.<\/p>\n<h3>Fun\u00e7\u00e3o de evento: convertXMLtoJSON<\/h3>\n<p>O Eventing permite que voc\u00ea escreva l\u00f3gica comercial pura, e o servi\u00e7o Eventing cuida de toda a infraestrutura necess\u00e1ria para gerenciar e dimensionar sua fun\u00e7\u00e3o (horizontal e verticalmente) em v\u00e1rios n\u00f3s de forma confi\u00e1vel e eficiente.<\/p>\n<p>Todas as fun\u00e7\u00f5es do Eventing t\u00eam dois pontos de entrada <code>OnUpdate(doc,meta)<\/code> e <code>OnDelete(meta,options)<\/code>. Observe que, neste exemplo, n\u00e3o estamos preocupados com o \u00faltimo ponto de entrada.<\/p>\n<p>Quando um documento \u00e9 alterado ou sofre muta\u00e7\u00e3o (inser\u00e7\u00e3o, reinser\u00e7\u00e3o, substitui\u00e7\u00e3o, etc.), uma c\u00f3pia do documento e alguns metadados sobre o documento s\u00e3o passados para um pequeno ponto de entrada JavaScript <code>OnUpdate(doc,meta)<\/code>:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n  \/\/ filter out non XML\r\n  if (!meta.id.startsWith(\"xml:\")) return;\r\n  \/\/ The KEY started with \"xml\" try to process it\r\n  \/\/ ===========================================================\r\n  \/\/ *** Do other work required here on non .in_xml changes ***\r\n  \/\/ ===========================================================\r\n  var jsonDoc = parseXmlToJson(doc.in_xml);\r\n  log(meta.id, \"1. INPUT xml doc.in_xml :\", doc.in_xml);\r\n  log(meta.id, \"2. OUTPUT doc.out_json :\", jsonDoc);\r\n  doc.out_json = jsonDoc;\r\n  \/\/ ===========================================================\r\n  \/\/ enrich the source bucket with .out_json\r\n  src_bkt[meta.id] = doc;\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>O <code>OnUpdate(doc,meta)<\/code> A l\u00f3gica acima executa quatro etapas em qualquer muta\u00e7\u00e3o.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Primeiro, o prefixo do <em>chave<\/em> \u00e9 verificado, se n\u00e3o come\u00e7ar com <code>xml:<\/code>n\u00e3o fazemos mais nada. Observe que <code>meta.id<\/code> \u00e9 o <em>chave<\/em> do documento.<\/li>\n<li>Em segundo lugar, apenas chamamos uma fun\u00e7\u00e3o <code>parseXmlToJson(doc.in_xml)<\/code> em que apenas passamos a string XML para a fun\u00e7\u00e3o.<\/li>\n<li>Terceiro, o que retorna \u00e9 adicionado como um novo campo \u00e0 c\u00f3pia do documento como a propriedade <code>out_json<\/code>.<\/li>\n<li>Em quarto lugar, atualizamos o documento em tempo real com a representa\u00e7\u00e3o JSON.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>A l\u00f3gica principal de convers\u00e3o de XML para JSON<\/h3>\n<p>Esta \u00e9 a l\u00f3gica central da convers\u00e3o de XML para JSON:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">\/\/ 6.6.0 version no String.matchAll need our own MatchAll function\r\nfunction* MatchAll(str, regExp) {\r\n  if (!regExp.global) {\r\n    throw new TypeError('Flag \/g must be set!');\r\n  }\r\n  const localCopy = new RegExp(regExp, regExp.flags);\r\n  let match;\r\n  while (match = localCopy.exec(str)) {\r\n    yield match;\r\n  }\r\n}\r\n\r\n\/\/ A simple XML to JSON parser\r\nfunction parseXmlToJson(xml) {\r\n    const json = {};\r\n    for (const res of MatchAll(xml,\/(?:&lt;(\\w*)(?:\\s[^&gt;]*)*&gt;)((?:(?!&lt;\\1).)*)(?:&lt;\\\/\\1&gt;)|&lt;(\\w*)(?:\\s*)*\\\/&gt;\/gm)) {\r\n        const key = res[1] || res[3];\r\n        const value = res[2] &amp;&amp; parseXmlToJson(res[2]);\r\n        json[key] = ((value &amp;&amp; Object.keys(value).length) ? value : res[2]) || null;\r\n    }\r\n    return json;\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Agradecimentos ao usu\u00e1rio <code>MasterPiece<\/code> no Stack Overflow por compartilhar <a href=\"https:\/\/stackoverflow.com\/questions\/1773550\/convert-xml-to-json-and-back-using-javascript\/61593773#61593773\" target=\"_blank\" rel=\"noopener\">o m\u00e9todo <code>parseXmlToJson(xml)<\/code> com o mundo<\/a>. O m\u00e9todo <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Guide\/Regular_Expressions\" target=\"_blank\" rel=\"noopener\">usa uma express\u00e3o regular interessante<\/a> na string XML e retorna um objeto JSON de primeira classe. (<em>Sim, ele funciona e \u00e9 elegante e compacto<\/em>.)<\/p>\n<p>Observe que, no Couchbase 7.0, o m\u00e9todo <code>MatchAll(str, regExp)<\/code> em nosso c\u00f3digo JavaScript acima \u00e9 <strong>n\u00e3o<\/strong> necess\u00e1rio porque o Couchbase agora tem um executor v8 mais atual que inclui <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/String\/matchAll\" target=\"_blank\" rel=\"noopener\">o <code>String.prototype.MatchAll()<\/code> fun\u00e7\u00e3o<\/a>.<\/p>\n<h3>Vamos otimizar a fun\u00e7\u00e3o de eventos<\/h3>\n<p>O que temos at\u00e9 agora funciona muito bem, mas h\u00e1 um problema.<\/p>\n<p>Suponha que seus dados tenham 100.000 muta\u00e7\u00f5es por segundo, todas com um <em>chave<\/em> prefixo de <code>xml:<\/code>. Mesmo que o <code>in_xml<\/code> nunca muda, nossa fun\u00e7\u00e3o Eventing atual a) realizar\u00e1 100.000 convers\u00f5es de XML para JSON e b) far\u00e1 100.000 grava\u00e7\u00f5es no servi\u00e7o de dados (ou armazenamento de valores-chave). Al\u00e9m disso, \u00e9 prov\u00e1vel que seu XML seja muito mais complexo do que a nossa amostra <code>in_xml<\/code> e pode ter um aninhamento profundo e milhares de campos.<\/p>\n<p>Algumas reflex\u00f5es que precisamos considerar:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>A convers\u00e3o de um documento XML grande e aninhado por meio de uma rotina recursiva exige recursos de computa\u00e7\u00e3o. O m\u00e9todo <code>parseXmlToJson(xml)<\/code> ser\u00e1 executado em cada muta\u00e7\u00e3o, mesmo que o XML n\u00e3o tenha sido alterado.<\/li>\n<li>A grava\u00e7\u00e3o em bancos de dados envolve E\/S, e queremos economizar ciclos ou grava\u00e7\u00f5es para trabalhos mais importantes. Com a fun\u00e7\u00e3o Eventing atual, executaremos uma grava\u00e7\u00e3o ou atualizaremos o documento no armazenamento de valores-chave em cada muta\u00e7\u00e3o, mesmo que o XML n\u00e3o tenha sido alterado.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Para corrigir os problemas acima, vamos adicionar alguma l\u00f3gica para atualizar apenas a propriedade do documento <code>out_xml<\/code> se o <code>in_xml<\/code> ou se ainda n\u00e3o tivermos um <code>out_xml<\/code> propriedade.<\/p>\n<p>Para implementar essa otimiza\u00e7\u00e3o, utilizaremos um <code>soma de verifica\u00e7\u00e3o<\/code> via Eventing's fast <code>crc64()<\/code> no m\u00e9todo <code>in_xml<\/code> e armazen\u00e1-la em nosso documento como uma propriedade: <code>xmlchksum<\/code>.<\/p>\n<p>Em seguida, podemos usar esse campo para minimizar o trabalho extra de converter desnecessariamente XML em JSON ou de gravar desnecessariamente um documento inalterado no servi\u00e7o de dados.<\/p>\n<p>Aqui est\u00e1 a otimiza\u00e7\u00e3o:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    \/\/ filter out non XML\r\n    if (!meta.id.startsWith(\"xml:\")) return;\r\n    \/\/ The KEY started with \"xml\" try to process it\r\n    \/\/ ===========================================================\r\n    \/\/ *** Do other work required here on non .in_xml changes ***\r\n    \/\/ ===========================================================\r\n    \/\/ let's see if we need to re-create our json representation.\r\n    var xmlchksum = crc64(doc.in_xml);\r\n    \/\/ ===========================================================\r\n    \/\/ Don't reprocess if the doc.in_xml has not changed this could be\r\n    \/\/ a big performance win if the doc has other fields that mutate.\r\n    \/\/ We do this via a checksum of the .in_xml property.\r\n    if (doc.xmlchksum &amp;&amp; doc.xmlchksum === xmlchksum) return;\r\n    \/\/ Either this is the first pass, or the .in_xml property changed.\r\n    var jsonDoc = parseXmlToJson(doc.in_xml);\r\n    log(meta.id,\"1. INPUT xml doc.in_xml :\", doc.in_xml);\r\n    log(meta.id,\"2. CHECKSUM doc.in_xml :\", xmlchksum);\r\n    log(meta.id,\"3. OUTPUT doc.out_json :\", jsonDoc);\r\n    doc.out_json = jsonDoc;\r\n    doc.xmlchksum = xmlchksum;\r\n    \/\/ ===========================================================\r\n    \/\/ enrich the source bucket with .out_json and .xmlchksum\r\n    src_bkt[meta.id] = doc;\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Veja o que acrescentamos ao original <code>OnUpdate(doc,meta)<\/code> ponto de entrada.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Primeiro, calculamos um <code>soma de verifica\u00e7\u00e3o<\/code> na string XML acessada a partir de <code>doc.in_xml<\/code>.<\/li>\n<li>Em segundo lugar, comparamos isso com um <code>soma de verifica\u00e7\u00e3o<\/code>: <code>doc.xmlchksum<\/code> (se existir).<\/li>\n<li>Em terceiro lugar, se o <code>soma de verifica\u00e7\u00e3o<\/code> estiver faltando ou for diferente, convertemos o XML em JSON e armazenamos tanto o novo <code>soma de verifica\u00e7\u00e3o<\/code> <code>xmlchksum<\/code> e o <code>out_json<\/code> no documento, gravando-o novamente no Data Service.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>A fun\u00e7\u00e3o final e completa do evento<\/h3>\n<p>Aqui est\u00e1 nossa fun\u00e7\u00e3o Eventing completa para converter XML em JSON com todas as otimiza\u00e7\u00f5es mencionadas anteriormente:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    \/\/ filter out non XML\r\n    if (!meta.id.startsWith(\"xml:\")) return;\r\n    \/\/ The KEY started with \"xml\" try to process it\r\n    \/\/ ===========================================================\r\n    \/\/ *** Do other work required here on non .in_xml changes ***\r\n    \/\/ ===========================================================\r\n    \/\/ let's see if we need to re-create our json representation.\r\n    var xmlchksum = crc64(doc.in_xml);\r\n    \/\/ ===========================================================\r\n    \/\/ Don't reprocess if the doc.in_xml has not changed this could be\r\n    \/\/ a big performance win if the doc has other fields that mutate.\r\n    \/\/ We do this via a checksum of the .in_xml property.\r\n    if (doc.xmlchksum &amp;&amp; doc.xmlchksum === xmlchksum) return;\r\n    \/\/ Either this is the first pass, or the .in_xml property changed.\r\n    var jsonDoc = parseXmlToJson(doc.in_xml);\r\n    log(meta.id,\"1. INPUT xml doc.in_xml :\", doc.in_xml);\r\n    log(meta.id,\"2. CHECKSUM doc.in_xml :\", xmlchksum);\r\n    log(meta.id,\"3. OUTPUT doc.out_json :\", jsonDoc);\r\n    doc.out_json = jsonDoc;\r\n    doc.xmlchksum = xmlchksum;\r\n    \/\/ ===========================================================\r\n    \/\/ enrich the source bucket with .out_json and .xmlchksum\r\n    src_bkt[meta.id] = doc;\r\n}\r\n\r\n\/\/ 6.6.0 version no String.matchAll need our own MatchAll function\r\nfunction* MatchAll(str, regExp) {\r\n  if (!regExp.global) {\r\n    throw new TypeError('Flag \/g must be set!');\r\n  }\r\n  const localCopy = new RegExp(regExp, regExp.flags);\r\n  let match;\r\n  while (match = localCopy.exec(str)) {\r\n    yield match;\r\n  }\r\n}\r\n\r\n\/\/ A simple XML to JSON parser\r\nfunction parseXmlToJson(xml) {\r\n    const json = {};\r\n    for (const res of MatchAll(xml,\/(?:&lt;(\\w*)(?:\\s[^&gt;]*)*&gt;)((?:(?!&lt;\\1).)*)(?:&lt;\\\/\\1&gt;)|&lt;(\\w*)(?:\\s*)*\\\/&gt;\/gm)) {\r\n        const key = res[1] || res[3];\r\n        const value = res[2] &amp;&amp; parseXmlToJson(res[2]);\r\n        json[key] = ((value &amp;&amp; Object.keys(value).length) ? value : res[2]) || null;\r\n    }\r\n    return json;\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Implementa\u00e7\u00e3o da fun\u00e7\u00e3o de eventos<\/h2>\n<p>Agora \u00e9 hora de implementar a fun\u00e7\u00e3o Eventing. Revisamos um pouco do c\u00f3digo e do design do tradutor de XML para JSON, e agora \u00e9 hora de ver tudo funcionando em conjunto.<\/p>\n<p>Neste ponto, temos uma fun\u00e7\u00e3o em JavaScript, portanto, precisamos adicion\u00e1-la ao cluster do Couchbase e implant\u00e1-la em um estado ativo.<\/p>\n<p>Este exemplo requer dois buckets: <strong>fonte<\/strong> (ou seja, seu armazenamento de documentos) e <strong>metadados<\/strong> (ou seja, um bloco de notas para Eventing que pode ser compartilhado com outras fun\u00e7\u00f5es de Eventing). O <strong>fonte<\/strong> deve ter um tamanho de, pelo menos, 100 MB (se voc\u00ea quiser testar com mais de 10 milh\u00f5es de documentos, talvez seja melhor criar o bloco <strong>fonte<\/strong> balde maior). O <strong>metadados<\/strong> deve ter o tamanho m\u00ednimo de 100 MB. Esses dois buckets j\u00e1 devem existir como <a href=\"#prereq\">de acordo com os pr\u00e9-requisitos acima<\/a>.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Verifique a configura\u00e7\u00e3o atual do seu bucket acessando o <strong>Console da Web do Couchbase &gt; Buckets<\/strong> p\u00e1gina:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11403 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/06\/XML2JSON_1_buckets-2-1024x290.png\" alt=\"The Couchbase Web Console Buckets page\" width=\"900\" height=\"255\" data-recalc-dims=\"1\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2-1024x290.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2-300x85.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2-768x218.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2-1536x435.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2-1320x374.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_1_buckets-2.png 1800w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Adicionar manualmente a fun\u00e7\u00e3o convertXMLtoJSON<\/h2>\n<p>Para adicionar a primeira fun\u00e7\u00e3o Eventing da lista <strong>Console da Web do Couchbase &gt; Eventos<\/strong> p\u00e1gina, clique em <strong>ADICIONAR FUN\u00c7\u00c3O<\/strong>para adicionar uma nova fun\u00e7\u00e3o. A fun\u00e7\u00e3o <strong>ADICIONAR FUN\u00c7\u00c3O<\/strong> A caixa de di\u00e1logo \u00e9 exibida.<\/p>\n<p>No <strong>ADICIONAR FUN\u00c7\u00c3O<\/strong> di\u00e1logo, forne\u00e7a as informa\u00e7\u00f5es abaixo para elementos de fun\u00e7\u00e3o individuais:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Para o <strong>Balde de origem<\/strong> definido como <strong>fonte<\/strong>.<\/li>\n<li>Para o <strong>Balde de metadados<\/strong> definido como <strong>metadados<\/strong>.<\/li>\n<li>Certifique-se de que <code>converterXMLparaJSON<\/code> \u00e9 o nome da fun\u00e7\u00e3o que voc\u00ea est\u00e1 criando no <strong>Nome da fun\u00e7\u00e3o<\/strong> caixa de texto.<\/li>\n<li>[Etapa opcional] Digite o texto <strong>Convers\u00e3o gen\u00e9rica de XML<\/strong>, no <strong>Descri\u00e7\u00e3o<\/strong> caixa de texto.<\/li>\n<li>Para o <strong>Configura\u00e7\u00f5es<\/strong> use os valores padr\u00e3o.<\/li>\n<li>Para o <strong>Amarra\u00e7\u00f5es<\/strong> crie dois v\u00ednculos:\n<ul>\n<li>Para a vincula\u00e7\u00e3o, o <strong>alias do balde<\/strong>, especifica <code>src_bkt<\/code> como o <strong>nome do alias<\/strong> do balde e selecione <strong>fonte<\/strong> como o bucket associado, e o modo deve ser <strong>leitura e grava\u00e7\u00e3o<\/strong>.<\/li>\n<li>Depois de definir suas configura\u00e7\u00f5es, sua caixa de di\u00e1logo dever\u00e1 ter a seguinte apar\u00eancia:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11391\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/06\/XML2JSON_2_addfunc-1011x1024.png\" alt=\"Couchbase add function dialogue box\" width=\"645\" height=\"653\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-1011x1024.png 1011w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-296x300.png 296w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-768x778.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-300x304.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc-20x20.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_2_addfunc.png 1290w\" sizes=\"auto, (max-width: 645px) 100vw, 645px\" \/><\/li>\n<li>Depois de fornecer todas as informa\u00e7\u00f5es necess\u00e1rias no formul\u00e1rio <strong>ADICIONAR FUN\u00c7\u00c3O<\/strong> di\u00e1logo, clique em <strong>Pr\u00f3ximo: Adicionar c\u00f3digo<\/strong>. O <code>cron_impl_2func_651<\/code> \u00e9 exibida. O di\u00e1logo <code>converterXMLparaJSON<\/code> cont\u00e9m inicialmente um bloco de c\u00f3digo de espa\u00e7o reservado. Voc\u00ea precisar\u00e1 substituir o c\u00f3digo JavaScript que desenvolvemos nesse bloco.<\/li>\n<li><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11392 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/06\/XML2JSON_3_addfunc-1024x297.png\" alt=\"convert XML to JSON with Couchbase Eventing\" width=\"900\" height=\"261\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc-1024x297.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc-300x87.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc-768x223.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc-1536x446.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc-1320x383.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_3_addfunc.png 1804w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/li>\n<li>Copie o c\u00f3digo-fonte JavaScript da fun\u00e7\u00e3o Eventing a seguir (48 linhas) e cole-o no bloco de c\u00f3digo de espa\u00e7o reservado de <code>converterXMLparaJSON<\/code>:\n<pre class=\"toolbar-overlay:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    \/\/ filter out non XML\r\n    if (!meta.id.startsWith(\"xml:\")) return;\r\n    \/\/ The KEY started with \"xml\" try to process it\r\n    \/\/ ===========================================================\r\n    \/\/ *** Do other work required here on non .in_xml changes ***\r\n    \/\/ ===========================================================\r\n    \/\/ let's see if we need to re-create our json representation.\r\n    var xmlchksum = crc64(doc.in_xml);\r\n    \/\/ ===========================================================\r\n    \/\/ Don't reprocess if the doc.in_xml has not changed this could be\r\n    \/\/ a big performance win if the doc has other fields that mutate.\r\n    \/\/ We do this via a checksum of the .in_xml property.\r\n    if (doc.xmlchksum &amp;&amp; doc.xmlchksum === xmlchksum) return;\r\n    \/\/ Either this is the first pass, or the .in_xml property changed.\r\n    var jsonDoc = parseXmlToJson(doc.in_xml);\r\n    log(meta.id,\"1. INPUT xml doc.in_xml :\", doc.in_xml);\r\n    log(meta.id,\"2. CHECKSUM doc.in_xml :\", xmlchksum);\r\n    log(meta.id,\"3. OUTPUT doc.out_json :\", jsonDoc);\r\n    doc.out_json = jsonDoc;\r\n    doc.xmlchksum = xmlchksum;\r\n    \/\/ ===========================================================\r\n    \/\/ enrich the source bucket with .out_json and .xmlchksum\r\n    src_bkt[meta.id] = doc;\r\n}\r\n\r\n\/\/ 6.6.0 version no String.matchAll need our own MatchAll function\r\nfunction* MatchAll(str, regExp) {\r\n  if (!regExp.global) {\r\n    throw new TypeError('Flag \/g must be set!');\r\n  }\r\n  const localCopy = new RegExp(regExp, regExp.flags);\r\n  let match;\r\n  while (match = localCopy.exec(str)) {\r\n    yield match;\r\n  }\r\n}\r\n\r\n\/\/ A simple XML to JSON parser\r\nfunction parseXmlToJson(xml) {\r\n    const json = {};\r\n    for (const res of MatchAll(xml,\/(?:&lt;(\\w*)(?:\\s[^&gt;]*)*&gt;)((?:(?!&lt;\\1).)*)(?:&lt;\\\/\\1&gt;)|&lt;(\\w*)(?:\\s*)*\\\/&gt;\/gm)) {\r\n        const key = res[1] || res[3];\r\n        const value = res[2] &amp;&amp; parseXmlToJson(res[2]);\r\n        json[key] = ((value &amp;&amp; Object.keys(value).length) ? value : res[2]) || null;\r\n    }\r\n    return json;\r\n}<\/pre>\n<\/li>\n<li>Ap\u00f3s a colagem, a tela \u00e9 exibida como mostrado abaixo:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11396 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/06\/XML2JSON_4_addfunc-1.png\" alt=\"The function editor in Couchbase Eventing\" width=\"1800\" height=\"1522\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1.png 1800w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1-300x254.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1-1024x866.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1-768x649.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1-1536x1299.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1-20x17.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_4_addfunc-1-1320x1116.png 1320w\" sizes=\"auto, (max-width: 1800px) 100vw, 1800px\" \/><\/li>\n<li>Clique em <strong>Salvar<\/strong>.<\/li>\n<li>Para retornar \u00e0 tela Eventing, clique no bot\u00e3o <strong>&lt; voltar para Eventing<\/strong> (abaixo do editor) ou clique no link <strong>Eventos<\/strong> op\u00e7\u00e3o.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Implementar a fun\u00e7\u00e3o<\/h2>\n<p>Agora, estamos prontos para iniciar as fun\u00e7\u00f5es de Eventing. A partir do <strong>Console da Web do Couchbase &gt; Eventos<\/strong> siga estas etapas:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Clique no nome da fun\u00e7\u00e3o <code>converterXMLparaJSON<\/code> para expandir e expor os controles de fun\u00e7\u00e3o.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11394 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/06\/XML2JSON_5_deploy-1024x288.png\" alt=\"Eventing function controls\" width=\"900\" height=\"253\" data-recalc-dims=\"1\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy-1024x288.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy-300x84.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy-768x216.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy-1536x432.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy-1320x371.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_5_deploy.png 1798w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/li>\n<li>Clique em <strong>Implementar<\/strong>.<\/li>\n<li>No <strong>Confirmar a fun\u00e7\u00e3o de implanta\u00e7\u00e3o<\/strong> di\u00e1logo, selecione <strong>Fun\u00e7\u00e3o de implanta\u00e7\u00e3o<\/strong> na op\u00e7\u00e3o Limite de alimenta\u00e7\u00e3o.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11395\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/06\/XML2JSON_6_deployconf.png\" alt=\"Confirm deploy function Couchbase\" width=\"382\" height=\"251\" data-recalc-dims=\"1\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_6_deployconf.png 764w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_6_deployconf-300x197.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/06\/XML2JSON_6_deployconf-20x13.png 20w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/li>\n<li>A implanta\u00e7\u00e3o de sua fun\u00e7\u00e3o levar\u00e1 cerca de 18 segundos para ficar ativa.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Teste a fun\u00e7\u00e3o de execu\u00e7\u00e3o<\/h2>\n<p>Neste ponto, temos um lambda em execu\u00e7\u00e3o que atualizar\u00e1 qualquer documento com um <em>chave<\/em> prefixo de <code>xml:<\/code> e uma propriedade XML de <code>in_xml<\/code>.<\/p>\n<p>Para exercer a fun\u00e7\u00e3o Eventing <code>converterXMLparaJSON<\/code>, v\u00e1 para o <strong>Documentos<\/strong> na interface do usu\u00e1rio e fa\u00e7a o seguinte:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Clique em <strong>ADICIONAR DOCUMENTO<\/strong>.<\/li>\n<li>Digite um <em>chave<\/em> de <code>xml::1<\/code> (apenas certifique-se de que o prefixo seja <code>xml:<\/code>)<\/li>\n<li>Clique em <strong>Salvar<\/strong>.<\/li>\n<li>Digite um <em>corpo<\/em> da seguinte forma:\n<pre class=\"toolbar-overlay:false wrap:true lang:js decode:true\">{\r\n  \"type\": \"xml\",\r\n  \"id\": 1,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\"\r\n}<\/pre>\n<\/li>\n<li>Clique em <strong>Salvar<\/strong>.<\/li>\n<li>Edite o documento que acabou de salvar; voc\u00ea perceber\u00e1 que ele foi atualizado em tempo real\n<pre class=\"toolbar-overlay:false wrap:true lang:js decode:true\">{\r\n  \"type\": \"xml\",\r\n  \"id\": 1,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\",\r\n  \"out_json\": {\r\n    \"CD\": {\r\n      \"TITLE\": \"EmpireBurlesque\",\r\n      \"ARTIST\": \"BobDylan\",\r\n      \"COUNTRY\": \"USA\",\r\n      \"COMPANY\": \"Columbia\",\r\n      \"PRICE\": \"10.90\",\r\n      \"YEAR\": \"1985\"\r\n    }\r\n  },\r\n  \"xmlchksum\": \"02087b7be275d0d8\"\r\n}<\/pre>\n<\/li>\n<li>Ajuste o <code>in_xml<\/code>. Talvez acrescentar <strong>FEVEREIRO<\/strong> antes do t\u00edtulo.\n<pre class=\"toolbar-overlay:false wrap:true lang:js decode:true\">\"in_xml\": \"&lt;CD&gt;&lt;MONTH&gt;FEB&lt;\/MONTH&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\",<\/pre>\n<\/li>\n<li>Clique em <strong>Salvar<\/strong>.<\/li>\n<li>Novamente, edite o documento que acabou de salvar. Voc\u00ea perceber\u00e1 que ele foi atualizado em tempo real mais uma vez:\n<pre class=\"toolbar-overlay:false wrap:true lang:js decode:true\">{\r\n  \"type\": \"xml\",\r\n  \"id\": 1,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;MONTH&gt;FEB&lt;\/MONTH&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\",\r\n  \"out_json\": {\r\n    \"CD\": {\r\n      \"MONTH\": \"FEB\",\r\n      \"TITLE\": \"EmpireBurlesque\",\r\n      \"ARTIST\": \"BobDylan\",\r\n      \"COUNTRY\": \"USA\",\r\n      \"COMPANY\": \"Columbia\",\r\n      \"PRICE\": \"10.90\",\r\n      \"YEAR\": \"1985\"\r\n    }\r\n  },\r\n  \"xmlchksum\": \"06b5b40b276f160b\"\r\n}<\/pre>\n<\/li>\n<li>Adicionar uma nova propriedade acima <code>tipo<\/code>como, por exemplo <code>\"outro\": \"isto \u00e9 divertido\",<\/code><\/li>\n<li>Clique em <strong>Salvar<\/strong>.<\/li>\n<li>Mais uma vez, edite o documento. Observe que o <code>soma de verifica\u00e7\u00e3o<\/code> n\u00e3o ser\u00e1 atualizado\n<pre class=\"toolbar-overlay:false lang:js decode:true\">{\r\n  \"other\": \"this is fun\",\r\n  \"type\": \"xml\",\r\n  \"id\": 1,\r\n  \"in_xml\": \"&lt;CD&gt;&lt;MONTH&gt;FEB&lt;\/MONTH&gt;&lt;TITLE&gt;EmpireBurlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;BobDylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.90&lt;\/PRICE&gt;&lt;YEAR&gt;1985&lt;\/YEAR&gt;&lt;\/CD&gt;\",\r\n  \"out_json\": {\r\n    \"CD\": {\r\n      \"MONTH\": \"FEB\",\r\n      \"TITLE\": \"EmpireBurlesque\",\r\n      \"ARTIST\": \"BobDylan\",\r\n      \"COUNTRY\": \"USA\",\r\n      \"COMPANY\": \"Columbia\",\r\n      \"PRICE\": \"10.90\",\r\n      \"YEAR\": \"1985\"\r\n    }\r\n  },\r\n  \"xmlchksum\": \"06b5b40b276f160b\"\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Vamos processar 100 mil registros XML<\/h2>\n<p>Agora que voc\u00ea j\u00e1 viu como as coisas funcionam, vamos despejar uma grande quantidade de dados na fun\u00e7\u00e3o. Primeiro, precisamos gerar alguns dados.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Usarei um script Perl simples chamado <code>xml_data_gen.pl<\/code> que escrevi para esta postagem do blog:\n<pre class=\"toolbar-overlay:false wrap:true lang:perl decode:true\">#!\/usr\/bin\/perl \r\nuse Getopt::Long qw(GetOptions);\r\n\r\nsub randi {\r\n    ($lower_limit,$upper_limit) = @_;\r\n    return int(rand($upper_limit-$lower_limit)) + $lower_limit;\r\n}\r\n\r\nmy $blk = 0;\r\nmy $num = 0;\r\nmy $help = 0;\r\nGetOptions(\r\n    'blk=i' =&gt; \\$blk,\r\n    'num=i' =&gt; \\$num,\r\n    'help' =&gt; \\$help,\r\n) or die \"Usage: $0 --blk # --num #\\n\";\r\n\r\nif ($num == 0 || $help != 0 || $blk &lt; 1) {\r\n    printf stderr \"Usage: $0 --blk # --num #\\n\";\r\n    printf stderr \"examples:\\n\";\r\n    printf stderr \".\/xml_data_gen.pl --blk 1 --num 100000 &gt; data.json\\n\";\r\n    printf stderr \"cbimport json -c couchbase:\/\/127.0.0.1 -u \\$CB_USERNAME \" .\r\n        \"-p \\$CB_PASSWORD -b source -d file:\/\/.\/data.json -f lines -t 4 -g xml::%%id%%\\n\";\r\n    exit(1);\r\n}\r\n\r\n@artist = (\"Elton John\", \"Lisa Lobb\", \"Sting\", \"Clash\", \"The Smiths\", \r\n    \"Bob Dylan\", \"The Yard Birds\", \"Journey\", \"Led Zeppelin\", \"Adele\");\r\n@title = (\"Empire Burlesque\", \"Greatest Hits\", \"Songs Vol 1.\", \"Songs Vol 2.\", \r\n    \"Songs Vol 3.\", \"Classics\", \"Hidden Tracks\");\r\n@country = (\"USA\", \"UK\", \"AU\", \"AR\", \"ES\", \"MO\");\r\n@company = (\"Columbia\", \"Capital\", \"Dog Boys\", \"Epic\", \"Home Brew\", \"EMG\");\r\n\r\n\r\n\r\n$template = '{\"type\":\"xml\",\"id\":_XXX_,\"in_xml\":\"&lt;CD&gt;&lt;TITLE&gt;_TTT_&lt;\/TITLE&gt;' .\r\n    '&lt;ARTIST&gt;_AAA_&lt;\/ARTIST&gt;&lt;COUNTRY&gt;_CCC_&lt;\/COUNTRY&gt;&lt;COMPANY&gt;_OOO_&lt;\/COMPANY&gt;' .\r\n    '&lt;PRICE&gt;_PPP_&lt;\/PRICE&gt;&lt;YEAR&gt;_YYY_&lt;\/YEAR&gt;&lt;\/CD&gt;\"}';\r\n\r\nmy $beg = 1 + ($blk-1) * $num;\r\nmy $max = $beg + $num - 1;\r\n\r\nmy $wrk = \"\";\r\nfor ($j=$beg; $j&lt;=$max; $j=$j+1) {\r\n\r\n    $wrk = $template; $wrk =~ s\/_XXX_\/$j\/;\r\n\r\n    $tmp = $artist[randi(0,$#artist-1)]; $wrk =~ s\/_AAA_\/$tmp\/;\r\n    $tmp = $title[randi(0,$#title-1)]; $wrk =~ s\/_TTT_\/$tmp\/;\r\n    $tmp = $country[randi(0,$#country-1)]; $wrk =~ s\/_CCC_\/$tmp\/;\r\n    $tmp = $company[randi(0,$#company-1)]; $wrk =~ s\/_OOO_\/$tmp\/;\r\n    $tmp = randi(850,1765)\/100; $wrk =~ s\/_PPP_\/$tmp\/;\r\n    $tmp = randi(1,30)+1981; $wrk =~ s\/_YYY_\/$tmp\/;\r\n\r\n    printf $wrk . \"\\n\";\r\n}<\/pre>\n<\/li>\n<li>Para testar o script gerador acima <code>xml_data_gen.pl<\/code> apenas corra: <code>.\/xml_data_gen.pl --blk 1 --num 5<\/code><\/li>\n<li>Voc\u00ea dever\u00e1 ver algo como:\n<pre class=\"striped:false wrap:true lang:js decode:true\">{\"type\":\"xml\",\"id\":1,\"in_xml\":\"&lt;CD&gt;&lt;TITLE&gt;Songs Vol 3.&lt;\/TITLE&gt;&lt;ARTIST&gt;Elton John&lt;\/ARTIST&gt;&lt;COUNTRY&gt;USA&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Epic&lt;\/COMPANY&gt;&lt;PRICE&gt;10.64&lt;\/PRICE&gt;&lt;YEAR&gt;2003&lt;\/YEAR&gt;&lt;\/CD&gt;\"}\r\n{\"type\":\"xml\",\"id\":2,\"in_xml\":\"&lt;CD&gt;&lt;TITLE&gt;Songs Vol 1.&lt;\/TITLE&gt;&lt;ARTIST&gt;Clash&lt;\/ARTIST&gt;&lt;COUNTRY&gt;AU&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Epic&lt;\/COMPANY&gt;&lt;PRICE&gt;12.69&lt;\/PRICE&gt;&lt;YEAR&gt;1989&lt;\/YEAR&gt;&lt;\/CD&gt;\"}\r\n{\"type\":\"xml\",\"id\":3,\"in_xml\":\"&lt;CD&gt;&lt;TITLE&gt;Empire Burlesque&lt;\/TITLE&gt;&lt;ARTIST&gt;Journey&lt;\/ARTIST&gt;&lt;COUNTRY&gt;AU&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Epic&lt;\/COMPANY&gt;&lt;PRICE&gt;15.25&lt;\/PRICE&gt;&lt;YEAR&gt;1999&lt;\/YEAR&gt;&lt;\/CD&gt;\"}\r\n{\"type\":\"xml\",\"id\":4,\"in_xml\":\"&lt;CD&gt;&lt;TITLE&gt;Songs Vol 1.&lt;\/TITLE&gt;&lt;ARTIST&gt;Bob Dylan&lt;\/ARTIST&gt;&lt;COUNTRY&gt;AR&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Dog Boys&lt;\/COMPANY&gt;&lt;PRICE&gt;15.43&lt;\/PRICE&gt;&lt;YEAR&gt;1997&lt;\/YEAR&gt;&lt;\/CD&gt;\"}\r\n{\"type\":\"xml\",\"id\":5,\"in_xml\":\"&lt;CD&gt;&lt;TITLE&gt;Greatest Hits&lt;\/TITLE&gt;&lt;ARTIST&gt;Journey&lt;\/ARTIST&gt;&lt;COUNTRY&gt;UK&lt;\/COUNTRY&gt;&lt;COMPANY&gt;Columbia&lt;\/COMPANY&gt;&lt;PRICE&gt;10.71&lt;\/PRICE&gt;&lt;YEAR&gt;1983&lt;\/YEAR&gt;&lt;\/CD&gt;\"}<\/pre>\n<\/li>\n<li>Para criar um registro de 100K <code>xml_data_gen.pl<\/code> para carregar posteriormente em seu cluster do Couchbase, basta executar: <code>.\/xml_data_gen.pl --blk 1 --num 100000 &gt; data.json<\/code><\/li>\n<li>Agora precisamos carregar os dados. Usarei o <code>cbimport<\/code> utilit\u00e1rio localizado no <code>.\/bin<\/code> de sua instala\u00e7\u00e3o do Couchbase em um de seus n\u00f3s. Presumo que voc\u00ea tenha acesso ao shell do cluster do Couchbase e as credenciais necess\u00e1rias.\n<pre class=\"toolbar-overlay:false wrap:true lang:sh decode:true\">cbimport json -c couchbase:\/\/127.0.0.1 -u $CB_USERNAME -p $CB_PASSWORD -b source -d file:\/\/.\/data.json -f lines -t 4 -g xml::%id%\r\n<\/pre>\n<\/li>\n<li>D\u00ea uma olhada. Todos os 100 mil itens ter\u00e3o sido convertidos instantaneamente \u00e0 medida que forem carregados (na muta\u00e7\u00e3o causada pela inser\u00e7\u00e3o).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Se quiser obter mais desempenho, voc\u00ea pode aumentar a escala verticalmente aumentando o n\u00famero de workers nas configura\u00e7\u00f5es de fun\u00e7\u00f5es ou adicionando mais n\u00f3s de Eventing. Se voc\u00ea quiser carregar mais dados e manter a resid\u00eancia de mem\u00f3ria 100%, talvez seja necess\u00e1rio aumentar o tamanho do seu bucket.<\/p>\n<h2>Considera\u00e7\u00f5es finais<\/h2>\n<p>Espero que voc\u00ea tenha achado este passo a passo educativo e que tenha desenvolvido mais apre\u00e7o por <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/eventing\/?ref=blog\" target=\"_blank\" rel=\"noopener\">o servi\u00e7o de eventos do Couchbase<\/a> como um todo.<\/p>\n<p>Anteriormente, otimizamos a fun\u00e7\u00e3o para usar menos recursos de computa\u00e7\u00e3o. Tamb\u00e9m poder\u00edamos otimizar o espa\u00e7o de armazenamento. Observe que temos um <code>in_xml<\/code> e um <code>out_json<\/code> em nossos documentos depois de enriquec\u00ea-los. Com apenas um pequeno ajuste (adicionando duas linhas), poder\u00edamos remover o <code>in_xml<\/code> e eliminar o armazenamento redundante (<em>economiza 30% de meu espa\u00e7o em disco para mim<\/em>). Optei por deixar isso de fora do exemplo para destacar melhor como a fun\u00e7\u00e3o foi executada, mas convido voc\u00ea a experimentar por conta pr\u00f3pria usando o seguinte:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    \/\/ filter out non XML\r\n    if (!meta.id.startsWith(\"xml:\")) return;\r\n    if (!doc.in_xml) return; \/\/ optimize for storage space\r\n    \r\n    \/\/ ALL OTHER LINES THE SAME\r\n    \r\n    delete doc.in_xml; \/\/ optimize for storage space\r\n    src_bkt[meta.id] = doc;\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Coloquei esse exemplo no site de documenta\u00e7\u00e3o principal do Couchbase como o Scriptlet de exemplo: <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-handler-convertXMLtoJSON.html?ref=blog\" target=\"_blank\" rel=\"noopener\">Fun\u00e7\u00e3o: <code>converterXMLparaJSON<\/code><\/a>. Ele n\u00e3o traduzir\u00e1 atributos XML, mas isso foi f\u00e1cil de adicionar (<em>veja o pr\u00f3ximo par\u00e1grafo<\/em>). No entanto, o m\u00e9todo simples <code>parseXmlToJson()<\/code> que utilizei se ajustou perfeitamente aos dados iniciais.<\/p>\n<p>Durante o desenvolvimento, comecei de forma simples e testei alguns documentos XML enormes, mas \u00e9 claro que talvez eu n\u00e3o tenha coberto toda a gama de constru\u00e7\u00f5es XML. Desenvolvi o segundo Scriptlet <code>converterAdvXMLparaJSON<\/code> (n\u00e3o mostrado neste artigo), pois logo descobri que <em>Muitos documentos XML utilizam atributos<\/em> e t\u00eam algumas variantes de sintaxe interessantes.<\/p>\n<pre class=\"striped:false lang:xhtml decode:true\">&lt;DOC_WITH_ATTRS&gt;\r\n  &lt;ADVELEM1 adv_attrA=\"adv_valA\" \/&gt;\r\n  &lt;ADVELEM2 adv_attrA=\"adv_valA\" adv_attrB=\"adv_valB\"&gt;\r\n    &lt;SUB&gt;\r\n      SUBDATA\r\n    &lt;\/SUB&gt;\r\n  &lt;\/ADVELEM2&gt;\r\n&lt;\/DOC_WITH_ATTRS&gt;\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Isso me levou a criar uma fun\u00e7\u00e3o Eventing mais extensa que traduz os atributos XML e as variantes de sintaxe que encontrei. Voc\u00ea tamb\u00e9m encontrar\u00e1 o c\u00f3digo-fonte dessa fun\u00e7\u00e3o Eventing mais longa e mais capaz no site de documenta\u00e7\u00e3o principal do Couchbase como o Scriptlet de exemplo: <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-handler-convertAdvXMLtoJSON.html?ref=blog\" target=\"_blank\" rel=\"noopener\">Fun\u00e7\u00e3o: <code>converterAdvXMLparaJSON<\/code><\/a>.  Essa vers\u00e3o mais avan\u00e7ada converteu com sucesso grandes documentos XML, incluindo \"arquivos de geometria do OpenStreetmap\" e tamb\u00e9m \"medi\u00e7\u00f5es operacionais de celulares da Huawei\".<\/p>\n<p>Eu o desafio a tentar fazer o seguinte:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Escreva uma fun\u00e7\u00e3o inversa: Em vez de <code>converterXMLparaJSON<\/code>, diga <code>converterJSONparaXML<\/code><\/li>\n<li>Alterar <code>converterAdvXMLparaJSON<\/code> para prefixar qualquer nome de propriedade, como <code>attr_<\/code> para ajud\u00e1-lo a identificar atributos XML na convers\u00e3o final do JSON.<\/li>\n<li>Adicionar um mapa JavaScript opcional e uma rotina para converter genericamente propriedades por nome em n\u00fameros reais e booleanos (em vez do tipo de string padr\u00e3o)<\/li>\n<li>Implemente um aprimoramento para aplicar uma \"Defini\u00e7\u00e3o de tipo de documento\" ou DTD aos dados de entrada, onde voc\u00ea l\u00ea a DTD de outro documento.<\/li>\n<li>Crie um tradutor para consultas XPath para abordar (apontar para) diferentes partes de uma representa\u00e7\u00e3o JSON do documento convertido.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>N\u00e3o se esque\u00e7a de experimentar o SQL++ (N1QL) no Query Workbench e usar o Index Advisor para consultar e criar \u00edndices ideais para acessar seus dados XML (transformados em JSON).<\/p>\n<h2>Recursos<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><em>Download:<\/em> <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Baixar o Couchbase Server 6.6.2<\/a><\/li>\n<li><em>Scriptlet de eventos:<\/em> <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-handler-convertXMLtoJSON.html?ref=blog\" target=\"_blank\" rel=\"noopener\">Fun\u00e7\u00e3o: <code>converterXMLparaJSON<\/code><\/a>.<\/li>\n<li><em>Scriptlet de eventos:<\/em> <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-handler-convertAdvXMLtoJSON.html?ref=blog\" target=\"_blank\" rel=\"noopener\">Fun\u00e7\u00e3o: <code>converterAdvXMLparaJSON<\/code><\/a>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Refer\u00eancias<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-overview.html?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o de eventos do Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/introduction\/whats-new.html?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">O que h\u00e1 de novo: Servidor Couchbase 6.6<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/eventing\/?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Outros blogs do Couchbase sobre eventos<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/1773550\/convert-xml-to-json-and-back-using-javascript\/61593773#61593773\" target=\"_blank\" rel=\"noopener\">Stack Overflow: Converter XML em JSON (e vice-versa) usando Javascript<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Espero t\u00ea-lo convencido de que o Couchbase via Eventing \u00e9 um banco de dados XML.<\/p>\n<p>Gostaria muito de saber o que voc\u00ea achou dos recursos do Couchbase e do Eventing e como eles beneficiar\u00e3o sua empresa no futuro. Compartilhe seu feedback nos coment\u00e1rios abaixo ou em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/?ref=blog\" target=\"_blank\" rel=\"noopener\">os f\u00f3runs do Couchbase<\/a>.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Couchbase and XML &#8211; no problem! I&#8217;ve heard it said dozens of times: &#8220;Hey, Couchbase is great but I use XML.&#8221; I recognize that countering with, &#8220;Couchbase can be your XML database&#8221; is pretty bold, especially for a JSON-oriented document [&hellip;]<\/p>","protected":false},"author":42711,"featured_media":11598,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,2273,2165,9327,1812],"tags":[2312,1543,1261,9247,1747],"ppma_author":[9113],"class_list":["post-11387","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-eventing","category-full-text-search","category-javascript","category-n1ql-query","tag-document-database","tag-javascript","tag-json","tag-key-value-store","tag-xml"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>XML Database Best Practices - The Couchbase Data Model<\/title>\n<meta name=\"description\" content=\"Find out how to use Eventing to transform Couchbase into an XML-capable database. This may sound too good to be true but trust us - it really does work!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/how-to-use-couchbase-xml-database\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How (and Why) to Use Couchbase as an XML Database\" \/>\n<meta property=\"og:description\" content=\"Find out how to use Eventing to transform Couchbase into an XML-capable database. This may sound too good to be true but trust us - it really does work!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/how-to-use-couchbase-xml-database\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-23T11:43:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:39:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jon Strabala, Principal Product Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jon Strabala, Principal Product Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/\"},\"author\":{\"name\":\"Jon Strabala, Principal Product Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc\"},\"headline\":\"How (and Why) to Use Couchbase as an XML Database\",\"datePublished\":\"2021-07-23T11:43:54+00:00\",\"dateModified\":\"2025-06-14T05:39:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/\"},\"wordCount\":3373,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg\",\"keywords\":[\"document database\",\"javascript\",\"JSON\",\"key-value store\",\"XML\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"Eventing\",\"Full-Text Search\",\"JavaScript\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/\",\"name\":\"XML Database Best Practices - The Couchbase Data Model\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg\",\"datePublished\":\"2021-07-23T11:43:54+00:00\",\"dateModified\":\"2025-06-14T05:39:21+00:00\",\"description\":\"Find out how to use Eventing to transform Couchbase into an XML-capable database. This may sound too good to be true but trust us - it really does work!\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg\",\"width\":1200,\"height\":675,\"caption\":\"Learn how to use the Couchbase Eventing Service to automatically convert your XML data into JSON\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How (and Why) to Use Couchbase as an XML Database\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc\",\"name\":\"Jon Strabala, Principal Product Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9c6045b0c2f7b07b0ee10f94ad748a25\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g\",\"caption\":\"Jon Strabala, Principal Product Manager, Couchbase\"},\"description\":\"Jon Strabala is a Principal Product Manager, responsible for the Couchbase Eventing Service. Before joining Couchbase, he spent more than 20 years building software products across various domains, starting with EDA in aerospace then transitioning to building enterprise software focused on what today is coined \u201cIoT\u201d and \u201cat-scale data.\u201d Jon worked for several small software consultancies until eventually starting and managing his own firm. He has extensive experience in NoSQL\/NewSQL, both in contributing and commercializing new technologies such as compressed bitmaps and column stores. Jon holds a bachelor\u2019s degree in electrical engineering and a master's in computer engineering, both from the University of Southern California, and an MBA from the University of California at Irvine.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jon-strabala\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"XML Database Best Practices - The Couchbase Data Model","description":"Descubra como usar o Eventing para transformar o Couchbase em um banco de dados compat\u00edvel com XML. Isso pode parecer bom demais para ser verdade, mas confie em n\u00f3s - isso realmente funciona!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/how-to-use-couchbase-xml-database\/","og_locale":"pt_BR","og_type":"article","og_title":"How (and Why) to Use Couchbase as an XML Database","og_description":"Find out how to use Eventing to transform Couchbase into an XML-capable database. This may sound too good to be true but trust us - it really does work!","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/how-to-use-couchbase-xml-database\/","og_site_name":"The Couchbase Blog","article_published_time":"2021-07-23T11:43:54+00:00","article_modified_time":"2025-06-14T05:39:21+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg","type":"image\/jpeg"}],"author":"Jon Strabala, Principal Product Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jon Strabala, Principal Product Manager, Couchbase","Est. reading time":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/"},"author":{"name":"Jon Strabala, Principal Product Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc"},"headline":"How (and Why) to Use Couchbase as an XML Database","datePublished":"2021-07-23T11:43:54+00:00","dateModified":"2025-06-14T05:39:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/"},"wordCount":3373,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg","keywords":["document database","javascript","JSON","key-value store","XML"],"articleSection":["Best Practices and Tutorials","Couchbase Server","Eventing","Full-Text Search","JavaScript","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/","url":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/","name":"XML Database Best Practices - The Couchbase Data Model","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg","datePublished":"2021-07-23T11:43:54+00:00","dateModified":"2025-06-14T05:39:21+00:00","description":"Descubra como usar o Eventing para transformar o Couchbase em um banco de dados compat\u00edvel com XML. Isso pode parecer bom demais para ser verdade, mas confie em n\u00f3s - isso realmente funciona!","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/07\/couchbase-xml-database-how-to-walkthrough.jpeg","width":1200,"height":675,"caption":"Learn how to use the Couchbase Eventing Service to automatically convert your XML data into JSON"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/how-to-use-couchbase-xml-database\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How (and Why) to Use Couchbase as an XML Database"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc","name":"Jon Strabala, gerente principal de produtos da Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9c6045b0c2f7b07b0ee10f94ad748a25","url":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","caption":"Jon Strabala, Principal Product Manager, Couchbase"},"description":"Jon Strabala \u00e9 gerente de produto principal, respons\u00e1vel pelo Couchbase Eventing Service. Antes de ingressar na Couchbase, ele passou mais de 20 anos criando produtos de software em v\u00e1rios dom\u00ednios, come\u00e7ando com EDA no setor aeroespacial e depois fazendo a transi\u00e7\u00e3o para a cria\u00e7\u00e3o de software corporativo com foco no que hoje \u00e9 chamado de \"IoT\" e \"dados em escala\". Jon trabalhou em v\u00e1rias pequenas empresas de consultoria de software at\u00e9 abrir e gerenciar sua pr\u00f3pria empresa. Ele tem ampla experi\u00eancia em NoSQL\/NewSQL, tanto na contribui\u00e7\u00e3o quanto na comercializa\u00e7\u00e3o de novas tecnologias, como bitmaps compactados e armazenamentos de colunas. Jon \u00e9 bacharel em engenharia el\u00e9trica e mestre em engenharia da computa\u00e7\u00e3o, ambos pela Universidade do Sul da Calif\u00f3rnia, e tem MBA pela Universidade da Calif\u00f3rnia em Irvine.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jon-strabala\/"}]}},"authors":[{"term_id":9113,"user_id":42711,"is_guest":0,"slug":"jon-strabala","display_name":"Jon Strabala, Principal Product Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","author_category":"","last_name":"Strabala, Principal Product Manager, Couchbase","first_name":"Jon","job_title":"","user_url":"","description":"Jon Strabala \u00e9 gerente de produto principal, respons\u00e1vel pelo Couchbase Eventing Service. Antes de ingressar na Couchbase, ele passou mais de 20 anos criando produtos de software em v\u00e1rios dom\u00ednios, come\u00e7ando com EDA no setor aeroespacial e depois fazendo a transi\u00e7\u00e3o para a cria\u00e7\u00e3o de software corporativo com foco no que hoje \u00e9 chamado de \"IoT\" e \"dados em escala\". Jon trabalhou em v\u00e1rias pequenas empresas de consultoria de software at\u00e9 abrir e gerenciar sua pr\u00f3pria empresa. Ele tem ampla experi\u00eancia em NoSQL\/NewSQL, tanto na contribui\u00e7\u00e3o quanto na comercializa\u00e7\u00e3o de novas tecnologias, como bitmaps compactados e armazenamentos de colunas. Jon \u00e9 bacharel em engenharia el\u00e9trica e mestre em engenharia da computa\u00e7\u00e3o, ambos pela Universidade do Sul da Calif\u00f3rnia, e tem MBA pela Universidade da Calif\u00f3rnia em Irvine."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/11387","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/42711"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=11387"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/11387\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/11598"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=11387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=11387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=11387"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=11387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}