Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: Azure Logic Apps (Consumption + Standard)
Para fluxos de trabalho de integração business-to-business (B2B), muitas vezes é necessário converter dados entre formatos XML e ficheiros planos antes de poder trocar esses dados com parceiros comerciais.
Este guia mostra como usar ações de conectores incorporadas no Flat File para codificar ou decodificar XML e para gerar esquemas de flat file compatíveis com BizTalk a partir de dados de exemplo.
Referência técnica do conector
O conector Flat File inclui as seguintes ações de codificação, descodificação e geração de esquemas:
| Action | Consumo | Standard |
|---|---|---|
| Codificação de ficheiros planos | Yes | Yes |
| Descodificação de ficheiros planos | Yes | Yes |
| Geração de Esquemas de Ficheiros Planos | No | Yes |
| Aplicação de Lógica | Meio Ambiente |
|---|---|
| Consumo | Aplicativos Lógicos Multilocatário do Azure |
| Standard | Aplicações Lógicas do Azure de locatário único, Ambiente de Serviço de Aplicações v3 (planos Windows apenas) e implantação híbrida |
Para obter mais informações, consulte Conectores incorporados da conta de integração.
Pré-requisitos
Uma conta do Azure e uma subscrição. Crie uma conta Azure gratuita.
O recurso e o fluxo de trabalho da aplicação lógica onde pretende usar as operações do Ficheiro Plano.
As operações de ficheiro plano não incluem nenhum gatilho. O teu fluxo de trabalho pode começar com qualquer trigger ou usar qualquer ação para trazer o XML de origem.
Os exemplos neste artigo utilizam o gatilho de pedido chamado When an HTTP request is received (quando um pedido HTTP é recebido).
Para obter mais informações, consulte:
Um recurso de conta de integração para definir e armazenar artefactos para integração empresarial e fluxos de trabalho B2B.
Sua conta de integração e o recurso do aplicativo lógico devem existir na mesma assinatura do Azure e na mesma região do Azure.
Antes de começar a trabalhar com operações de Flat File , deve ligar a sua aplicação de lógica de consumo ou a sua aplicação de lógica Standard à conta de integração para trabalhar com artefactos como parceiros comerciais e acordos. Pode ligar uma conta de integração a múltiplos recursos da aplicação Consumption ou Standard Logic para partilhar os mesmos artefactos.
Sugestão
Se não estiver a trabalhar com artefactos B2B como parceiros comerciais e acordos em fluxos de trabalho Standard, pode não precisar de uma conta de integração. Em vez disso, pode carregar esquemas diretamente para o recurso da sua aplicação Standard Logic. De qualquer forma, podes usar o mesmo esquema em todos os subfluxos de trabalho no mesmo recurso da aplicação lógica. Para usar o mesmo esquema em vários recursos da Logic App, deve usar e ligar uma conta de integração.
Um esquema de ficheiro plano que especifica como codificar ou decodificar conteúdo XML.
Nos fluxos de trabalho Standard, as operações de Ficheiro Plano permitem-lhe selecionar um esquema a partir de uma conta de integração ligada ou que tenha carregado anteriormente para a sua aplicação lógica, mas não ambos.
Para mais informações, consulte Adicionar esquemas às contas de integração.
Instale ou use uma ferramenta que possa enviar solicitações HTTP para testar sua solução, por exemplo:
- Código do Visual Studio com uma extensão do Visual Studio Marketplace
- PowerShell Invoke-RestMethod
- Microsoft Edge - Ferramenta Network Console
- Bruno
- curl
Atenção
Para cenários em que você tem dados confidenciais, como credenciais, segredos, tokens de acesso, chaves de API e outras informações semelhantes, certifique-se de usar uma ferramenta que proteja seus dados com os recursos de segurança necessários. A ferramenta deve funcionar offline ou localmente e não requer login em uma conta online ou sincronização de dados com a nuvem. Ao usar uma ferramenta com essas características, você reduz o risco de expor dados confidenciais ao público.
Limitações
O conteúdo XML que você deseja decodificar deve ser codificado no formato UTF-8.
No seu esquema de ficheiro simples, certifique-se de que os grupos XML contidos não têm um número excessivo de ocorrências da propriedade
max countdefinida com um valor superior a 1. Evite aninhar um grupo XML com um valor da propriedademax countsuperior a 1 dentro de outro grupo XML com um valor da propriedademax countsuperior a 1.Quando o Azure Logic Apps analisa o esquema do ficheiro plano, e quando o esquema permite a escolha do próximo fragmento, o Azure Logic Apps gera um símbolo e uma previsão para esse fragmento. Se o esquema permitir demasiados construtos, por exemplo, mais de 100.000, a expansão do esquema torna-se muito grande, o que consome demasiados recursos e demasiado tempo.
Carregar esquema
Depois de criar o seu esquema, carregue o esquema com base no seu fluxo de trabalho:
Consumo: Adicionar esquemas às contas de integração para fluxos de trabalho de Consumo
Standard: Adicionar esquemas às contas de integração para fluxos de trabalho Standard
Adicionar uma ação de codificação de ficheiro plano
No portal do Azure, abra seu recurso de aplicativo lógico.
No designer, abre o teu fluxo de trabalho.
Se o fluxo de trabalho não tiver um gatilho ou quaisquer outras ações necessárias, adicione essas operações primeiro.
Este exemplo usa o gatilho Request chamado Quando uma solicitação HTTP é recebida. Para adicionar um gatilho, veja Adicionar um gatilho para iniciar o seu fluxo de trabalho.
No designer, siga estes passos gerais para adicionar a ação incorporada chamada Flat File Encoding.
O painel de informações de ações abre-se com o separador Parâmetros selecionado.
No parâmetro de Conteúdo da ação, forneça o conteúdo XML para codificar, que é produzido pelo gatilho ou de uma ação anterior, seguindo estes passos:
Selecione dentro da caixa de Conteúdo e depois selecione o ícone de relâmpago para abrir a lista dinâmica de conteúdo.
Da lista de conteúdos dinâmicos, selecione o conteúdo XML a codificar.
O exemplo seguinte mostra a lista de conteúdo dinâmico aberta, a saída do disparador When an HTTP request is received e o conteúdo Body selecionado da saída do disparador.
Nota
Se Corpo não aparecer na lista de conteúdo dinâmico, ao lado do rótulo da secção Quando um pedido HTTP é recebido , selecione Ver mais. Você também pode inserir diretamente o conteúdo a ser codificado na caixa Conteúdo .
Na lista Schema Name, selecione o seu esquema.
Nota
Se a lista de esquemas estiver vazia, a causa pode ser:
- O recurso da aplicação lógica não está ligado a uma conta de integração.
- A conta de integração ligada não contém ficheiros de esquema.
- O recurso da app lógica não contém ficheiros de esquema. Esta razão aplica-se apenas a aplicações de lógica padrão.
Para adicionar outros parâmetros opcionais à ação, selecione esses parâmetros da lista de parâmetros Avançados .
Parâmetro valor Descrição Modo de gerar nó vazio ForcedDisabled ou HonorSchemaNodeProperty ou ForcedEnabled O modo a utilizar para a geração de nós vazios com codificação de ficheiro simples.
No BizTalk, o esquema de ficheiro simples tem uma propriedade que controla a geração de nós vazios. Pode acompanhar o comportamento da propriedade de geração de nós vazios no seu esquema de ficheiro plano. Em alternativa, pode usar esta configuração para que o Azure Logic Apps gere ou omita nós vazios. Para obter mais informações, consulte Tags para elementos vazios.Normalização XML Sim ou Não A configuração para habilitar ou desabilitar a normalização XML na codificação de arquivo simples. Para obter mais informações, consulte XmlTextReader.Normalization. Salve seu fluxo de trabalho. Na barra de ferramentas do estruturador, selecione Guardar.
Adicionar uma ação de descodificação de ficheiro plano
No portal do Azure, abra seu recurso de aplicativo lógico.
No designer, abre o teu fluxo de trabalho.
Se o fluxo de trabalho não tiver um gatilho ou quaisquer outras ações necessárias, adicione essas operações primeiro.
Este exemplo usa o gatilho Request chamado Quando uma solicitação HTTP é recebida. Para adicionar um gatilho, veja Adicionar um gatilho para iniciar o seu fluxo de trabalho.
No designer, siga estes passos gerais para adicionar a ação incorporada chamada Flat File Decoding.
No parâmetro Content da ação, forneça o conteúdo XML para descodificar, seja como saída do trigger ou de uma ação anterior, seguindo estes passos:
Selecione dentro da caixa de Conteúdo e depois selecione o ícone de relâmpago para abrir a lista dinâmica de conteúdo.
Da lista de conteúdo dinâmico, selecione o conteúdo XML a decodificar.
O exemplo seguinte mostra a lista de conteúdo dinâmico aberta, a saída do disparador When an HTTP request is received e o conteúdo Body selecionado da saída do disparador.
Nota
Se Body não aparecer na lista de conteúdo dinâmico, selecione Ver mais ao lado do rótulo da secção Quando um pedido HTTP é recebido. Você também pode inserir diretamente o conteúdo a ser decodificado na caixa Conteúdo .
Na lista Nome do esquema, selecione o seu esquema.
Nota
Se a lista de esquemas estiver vazia, a causa pode ser:
- O recurso da aplicação lógica não está ligado a uma conta de integração.
- A conta de integração ligada não contém ficheiros de esquema.
- O recurso da app lógica não contém ficheiros de esquema. Esta razão aplica-se apenas a aplicações de lógica padrão.
Salve seu fluxo de trabalho. Na barra de ferramentas do estruturador, selecione Guardar.
Agora você terminou de configurar sua ação de decodificação de arquivo simples. Em um aplicativo do mundo real, talvez você queira armazenar os dados decodificados em um aplicativo de linha de negócios (LOB), como o Salesforce. Ou, você pode enviar os dados decodificados para um parceiro comercial. Para enviar a saída da ação de decodificação para o Salesforce ou para seu parceiro comercial, use os outros conectores disponíveis nos Aplicativos Lógicos do Azure:
Adicionar uma ação de geração de esquema de ficheiro plano
A ação Geração de Esquema de Ficheiro Plano gera um esquema de ficheiro plano XSD em tempo de execução a partir de conteúdo de ficheiro plano de exemplo que fornece como entrada. O esquema gerado é compatível com anotações de ficheiros planos do BizTalk, como b:schemaInfo, b:recordInfo, e b:fieldInfo.
No portal do Azure, abra seu recurso de aplicativo lógico.
No designer, abre o teu fluxo de trabalho.
Se o fluxo de trabalho não tiver um gatilho ou quaisquer outras ações necessárias, adicione essas operações primeiro.
Este exemplo usa o gatilho Request chamado Quando uma solicitação HTTP é recebida. Para adicionar um gatilho, veja Adicionar um gatilho para iniciar o seu fluxo de trabalho.
No designer, siga estes passos gerais para adicionar a ação incorporada chamada Geração de Esquemas de Ficheiros Planos.
No parâmetro Conteúdo da ação, forneça o conteúdo da amostra do ficheiro plano.
Pode usar conteúdo da saída do gatilho ou de uma ação anterior:
Selecione dentro da caixa de Conteúdo e depois selecione o ícone de relâmpago para abrir a lista dinâmica de conteúdo.
Da lista de conteúdo dinâmico, selecione o conteúdo de ficheiro plano de exemplo.
Defina o parâmetro de estrutura de Registo para Delimitado ou Posicional.
O projetista utiliza parâmetros dinâmicos (
getFlatFileSchemaGenerationParameters) para mostrar o conjunto correto de parâmetros, com base no valor selecionadorecordStructure.O exemplo seguinte mostra os parâmetros de configuração para a estrutura de registos delimitada :
O exemplo seguinte mostra os parâmetros de configuração para a estrutura de registo posicional :
Para a estrutura de registos selecionada, defina os parâmetros obrigatórios e opcionais.
Parâmetros comuns (Delimitados e Posicionais)
Parâmetro Tipo Obrigatório Descrição contentAny Yes Conteúdo de dados de amostra em ficheiros planos (string ou binário). recordStructureString Yes DelimitedouPositional.hasHeaderbooleano Yes Se true, trata a primeira linha de registo como o cabeçalho e usa esses valores como os nomes dos campos gerados.recordDelimiterString No Delimitador de linha de registo. A análise sintética usa este valor literalmente (sem descodificação hexadecimal). Use caracteres reais, como \r\nou\n. Para usar a divisão de linha por defeito, omita este valor. O XSD gerado pode emitir um valor hexadecimal (0x0D0A) nas anotações de esquema.recordDelimiterOrderString No Colocação do delimitador: Infix(padrão),Prefix, ouPostfix.rootElementNameString No Nome do elemento raiz para o XSD. Padrão: Root.targetNamespaceString No Espaço de nomes alvo para o esquema. Predefinição: http://schemas.microsoft.com/FlatFile/{RootElementName}recordNameString No Nome para o elemento de registo filho repetido. Predefinição: {RootElementName}_RecordParâmetros específicos delimitados
Parâmetro Tipo Obrigatório Descrição fieldDelimiterString Yes Caracteres delimitadores de campo, como vírgula, ponto e vírgula, tab, Fornecer caracteres reais, como ,,;, ou\t. A análise sintáctica usa comparação literal de cadeias (sem decodificação hexadecimal).fieldDelimiterOrderString Yes Colocação do delimitador: Infix(padrão),Prefix, ouPostfix.escapeCharacterString No Caráter de escape para delimitadores incorporados nos valores de campo. Forneça o carácter real, como \ou". A análise sintáctica usa correspondência literal (sem decodificação hexadecimal).Parâmetros específicos da posição
Parâmetro Tipo Obrigatório Descrição countPositionsByBytebooleano Yes Mede os comprimentos dos campos em bytes ( true) ou caracteres (false). Relevante para codificações multibyte.fieldPositionsArray Yes Array de objetos de posição de campo, cada um com lengthejustification.fieldPositions[].lengthInteger Yes Largura fixa do campo. fieldPositions[].justificationString Yes Controla o alinhamento do almofadamento. Introduza manualmente o valor LeftouRight(sem distinção entre maiúsculas e minúsculas).
Nota: O designer atual não fornece uma lista para selecionar um valor.Antes de executares o fluxo de trabalho, revê o delimitador e o comportamento da personagem de escape:
Comportamento do delimitador de registos
Aspect Comportamento Análise sintática (divisão de linhas) options.RecordDelimiter(valor bruto de utilizador) passa diretamente paraString.Split(). Sem descodificação hexadecimal.Saída XSD GetRecordDelimiterForSchema()é convertido da seguinte forma:
- Se tiver o prefixo0x-, deixar passar.
- Se estiver vazio, assume0x0D0Apor predefinição.
- Caso contrário, converter caracteres literais em bytes hexadecimais.Entrada hexadecimal Não para análise sintética. Se fornecer 0x0D0A, a análise sintática tenta dividir com base no texto literal0x0D0A.O que fornecer Utilize os caracteres literais: \r\n,\nou omita-os completamente, caso em que, por predefinição, a divisão é feita em\r\n/\n/\r.Comportamento do delimitador de campo
Aspect Comportamento Análise (divisão de campos) options.FieldDelimiteré passado diretamente paraSplitDelimitedRecord()como uma comparação literal de cadeias de caracteres. Sem descodificação hexadecimal.Saída XSD Se o valor começar por 0x, emitechild_delimiter_type="hex"; caso contrário,"char".Entrada hexadecimal Não para análise sintética. 0x09Corresponde ao texto0x09literal, não ao tab.O que fornecer Usa personagem(s) real(is): ,,;,\t,|, e assim sucessivamente.Comportamento das personagens de fuga
Aspect Comportamento Análise sintática (escapar) options.EscapeCharacteré comparado literalmente. Quando houver correspondência, o carácter seguinte é consumido tal como está. Sem descodificação hexadecimal.Saída XSD Se o valor começar com 0x, emiteescape_char_type="hex"; caso contrário,"char".Entrada em hexadecimal Não para análise sintética. O mesmo comportamento de correspondência literal. O que fornecer Use a personagem real, por exemplo, \ou".Salve seu fluxo de trabalho. Na barra de ferramentas do estruturador, selecione Guardar.
Para usar a saída do esquema gerada para ações de decodificação ou codificação, guarde manualmente esta saída como ficheiro
.xsd.Carrega o
.xsdficheiro na tua conta de integração. Ou, para fluxos de trabalho padrão, carregue o ficheiro na pasta Artefactos do recurso da aplicação lógica. Também pode usar a API REST para carregar o artefacto do esquema.O esquema gerado é devolvido no corpo de saída da ação como uma string:
@body('Flat_File_Schema_Generation')Opcionalmente, use os seguintes exemplos de definição:
Exemplo delimitado
{ "Flat_File_Schema_Generation": { "type": "FlatFileSchemaGeneration", "runAfter": {}, "inputs": { "content": "@triggerBody()", "recordStructure": "Delimited", "fieldDelimiter": ";", "fieldDelimiterOrder": "Infix", "recordDelimiter": "\\r\\n", "hasHeader": true, "rootElementName": "MerchantOrders", "targetNamespace": "http://schemas.contoso.com/FlatFile/MerchantOrders", "recordName": "MerchantOrder", "escapeCharacter": "\\" } } }Exemplo de posição
{ "Flat_File_Schema_Generation": { "type": "FlatFileSchemaGeneration", "runAfter": {}, "inputs": { "content": "@triggerBody()", "recordStructure": "Positional", "fieldPositions": [ { "length": 6, "justification": "Left" }, { "length": 5, "justification": "Left" }, { "length": 3, "justification": "Left" } ], "countPositionsByByte": false, "hasHeader": false, "rootElementName": "Ledger", "targetNamespace": "http://schemas.contoso.com/FlatFile/Ledger" } } }Passe o esquema gerado para a ação seguinte:
{ "Next_Action": { "inputs": { "schema": "@body('Flat_File_Schema_Generation')" }, "runAfter": { "Flat_File_Schema_Generation": [ "Succeeded" ] } } }Revise a saída, as regras de inferência e os problemas conhecidos:
Output:
Property Tipo Descrição bodyString Gerou um esquema XSD compatível com BizTalk como uma string XML. Conteúdos XSD gerados de nível superior:
-
b:schemaInfoanotação comstandard="Flat File",root_reference, ecodepage="65001"(UTF-8) -
b:recordInfoanotações por registo comstructure,child_delimiter,child_delimiter_type,child_ordere os opcionaisescape_chareescape_char_type -
b:fieldInfoanotações por campo comjustificatione, para esquemas posicionais,pos_offsetepos_length - Inferência de tipo de dados a partir de dados amostrais:
xs:string,xs:integer,xs:decimal,xs:boolean,xs:date,xs:dateTime
Inferência de tipo de dado a partir do primeiro registo de dados não vazio:
Valor da amostra Tipo XSD inferido trueoufalsexs:boolean12345xs:integer19.99xs:decimal2025-01-15xs:date2025-01-15T10:30:00xs:dateTimeQualquer outro valor xs:stringOrdem do filho (colocação do delimitador):
Order Meaning Exemplo ( ;)InfixDelimitador entre campos A;B;CPrefixDelimitador antes de cada campo ;A;B;CPostfixDelimitador após cada campo A;B;C;Gestão de cabeçalhos:
- Quando
hasHeaderétrue, a primeira linha é tratada como nomes de campos, não como dados. - Os valores do cabeçalho são higienizados para nomes válidos de elementos XML. Os caracteres especiais tornam-se
_, e os dígitos iniciais recebem um_prefixo. - Se existir apenas uma linha de cabeçalho e não existirem registos de dados, os campos por defeito são
xs:string. - Se um campo de cabeçalho estiver em branco, o nome do campo gerado recorre a
Field{N}. - Quando
hasHeaderéfalse, os campos são automaticamente nomeadosField1,Field2,Field3e assim sucessivamente.
-
Limitações e problemas conhecidos
| Limitação | Descrição |
|---|---|
| A inferência de tipo utiliza um único registo. | O primeiro registo de dados não vazio determina os tipos de coluna. |
| Apenas um tipo de registo | A ação gera uma estrutura de registo repetida e não suporta layouts heterogéneos de registos. |
| Sem registos aninhados ou hierárquicos | O esquema gerado é plano, o que significa que tens um elemento raiz com um registo filho repetitivo e campos. |
| Os limites posicionais não são detetados automaticamente. | Você deve fornecer os comprimentos exatos dos campos em fieldPositions. |
| Apenas página de código UTF-8 | Conjuntos de esquemas gerados codepage="65001" e não disponibilizam a seleção da codificação. |
| O comportamento das personagens de fuga é literal. | O processamento de escapes faz corresponder o valor literal e salta apenas o carácter seguinte. |
recordName Padrão |
Se não for especificado, o padrão será {RootElementName}_Record. |
| Entrada de justificação do designer |
fieldPositions[].justification suporta apenas Left e Right. |
| Issue | Resolução |
|---|---|
| Contagem errada de campos | Verifique se fieldDelimiterOrder corresponde ao seu formato de dados (Infix, Prefix, Postfix). |
| Os valores hexadecimais são apenas para visualização | Embora o XSD gerado possa mostrar delimitadores como valores hexadecimais (por exemplo, 0x0D0A) e passar por 0xvalores com prefixo - em anotações, a análise não decodifica a entrada hexadecimal. Para análise sintática, forneça sempre caracteres delimitadores reais (\r\n, \n, \t, ,, ;). |
| Os nomes dos campos do cabeçalho parecem inesperados | Os valores dos cabeçalhos são suavizados para nomes XML válidos. Por exemplo, 1st Qty passa a _1st_Qty. |
| Comportamento do delimitador de registos | Se recordDelimiter for omitido, o analisador sintático separa com base nos caracteres reais de nova linha (\r\n, \n, \r). Nas anotações XSD geradas, o delimitador de registo predefine-se como 0x0D0A. |
Solucionar problemas
| Erro | Motivo | Resolução |
|---|---|---|
The flat file sample data content is required. |
content é nulo ou vazio. |
Certifique-se de que o accionador ou a ação anterior fornecem conteúdo de ficheiro simples não vazio. |
The schema generation options are required. |
Erro interno: o objeto options é nulo. | Verifique se a definição do fluxo de trabalho contém entradas válidas. |
Failed to generate flat file schema: '{details}'. |
Erro inesperado em tempo de execução, por exemplo, codificação ou dados deformados. | Inspecione os detalhes ou a mensagem de erro interna para a causa raiz. |
The field delimiter is required for delimited record structure. |
recordStructure é Delimited mas fieldDelimiter está em falta ou vazia. |
Forneça fieldDelimiter, por exemplo, vírgula, ponto e vírgula ou tab. Não forneça texto hexadecimal como 0x09; forneça caracteres reais como \t. |
The field positions array is required for positional record structure. |
recordStructure é Positional mas fieldPositions está em falta ou vazia. |
Forneça fieldPositions com os valores de length e justification para cada campo. |
The flat file sample data contains no data records. |
Não existem linhas de dados não vazias (ou apenas cabeçalho quando hasHeader=true). |
Forneça pelo menos um registo de dados não vazio no conteúdo de amostra. |
Positional field '{N}' exceeds the record length. Record length: '{len}', position: '{pos}', field length: '{fieldLen}'. |
O comprimento total do campo ultrapassa o comprimento recorde. | Ajuste os comprimentos de fieldPositions ou verifique se countPositionsByByte deve ser alterado. |
Testar o fluxo de trabalho
Para acionar seu fluxo de trabalho, siga estas etapas:
No gatilho Request , encontre o parâmetro HTTP POST URL e copie o URL.
Abra sua ferramenta de solicitação HTTP e use suas instruções para enviar uma solicitação HTTP para a URL copiada, incluindo o método esperado pelo gatilho de solicitação .
Este exemplo usa o
POSTmétodo com a URL.Inclua o conteúdo XML que você deseja codificar ou decodificar no corpo da solicitação.
Depois de terminar o seu fluxo de trabalho, vá ao histórico de execuções do fluxo de trabalho e examine as entradas e saídas da ação Flat File .