Criando coleções de dados em XML com Unit especializada

Explicação de como utilizar a unit para criar coleções de dados em XML

Descrição da Unit

A Unit utuFieldCollection fornece um conjunto de métodos que permitem a criação de coleções de dados. Ela é descrita abaixo:

unit utuFieldCollection;

interface

uses
  acuFramework, acuObject, utuMessage;

type
  utFieldCollection = class
    class function AddCollection(const piFieldName: string; const poField: utField): utField;
    class procedure AddCurioNamespace(const piField: utField);
    class procedure SetToUnwrap(const piField: utField);
  end;

implementation

uses
  sysUtils, ucuUseCase;

class function utFieldCollection.AddCollection(const piFieldName: string;
  const poField: utField): utField;
var
  lField: utField;
begin
  lField := poField.AddField(piFieldName);
  lField.AddAttribute('curio:collection').AsBoolean := true;
  Result := lField;
end;

class procedure utFieldCollection.AddCurioNamespace(const piField: utField);
begin
  piField.AddAttribute('xmlns:curio').AsString := 'http://www.evologica.com.br/';
end;

class procedure utFieldCollection.SetToUnwrap(const piField: utField);
begin
  piField.AddAttribute('curio:unwrap').AsBoolean := true;
end;

initialization

finalization

end.

O método AddCollection cria um novo campo no XML anotado como uma coleção. Ele recebe como parâmetro o nome da coleção e o campo pai da coleção.

O método SetToUnwrap é utilizado para demarcar quais campos do XML devem ser "desembrulhados", isto é, devem ter apenas seus valores internos considerados. Ele recebe como parâmetro o campo a ser anotado. Obs: um campo anotado com unwrap não deve ter filhos, apenas um valor único.

O método AddCurioNamespace define o namespace curio que é utilizado para definir uma coleção e se os elementos dentro de uma coleção devem ser "desembrulhados". Ele recebe como parâmetro o campo raiz, então sugere-se passar o campo do SYSMSG como seu argumento.

Criando requests em XML para atender o padrão com coleções

Para satisfazer os requerimentos de conversão entre XML/JSON, é necessário entender como o conversor transforma as requests recebidas.

XML -> JSON:

//Coleção pura
//Para garantir a padronização, as tags filhas devem ser do mesmo tipo.
//Nas conversões de JSON para XML com Collection, os filhos sempre serão colocados com tag 'Item')
...
<Colecao curio:collection="true">   <---->   Colecao: [
  <Item att1="1" att2="2" />        <---->     { _att1: "1", _att2: "2" },
  <Item att1="3" att2="4" />        <---->     { _att1: "3", _att2: "4" },
  <Item att1="5" att2="6" />        <---->     { _att1: "5", _att2: "6" }
</Colecao>                          <---->   ]
...

//Coleção com unwrap
...
<Colecao curio:collection="true" curio:unwrap="true">   <---->   Colecao: [
  <Item>1</Item>                                        <---->     "1",
  <Item>2</Item>                                        <---->     "2",
  <Item>3</Item>                                        <---->     "3"
</Colecao>                                              <---->   ] 
...

//Elemento simples com filho(s)
...
<ElementoPai>                       <---->   ElementoPai: {
  <ElementoFilho1 />                <---->     ElementoFilho1: ...,
  <ElementoFilho2 />                <---->     ElementoFilho2: ...
</ElementoPai>                      <---->   }
...

//Elemento simples
...
<Elemento att1="1" att2="2">5</Elemento>    <---->   Elemento: { _: "5", _att1: "1", _att2: "2" }
...