Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

Horse-XMLDoc

⚡ Horse-XMLDoc é um middleware para tratamento de XML em APIs desenvolvidas com o framework Horse.

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

</br>

Horse-XMLDoc

Horse-XMLDoc é um middleware para tratamento de XML em APIs desenvolvidas com o framework Horse.

❓ O que é um XML?

O XML(eXtensible Markup Language) é uma linguagem de marcação como o HTML, utilizada para estruturar, armazenar e transportar dados e que pudesse ser lido por software, e integrar-se com as demais linguagens.

Continue lendo...

⚙️ Instalação Automatizada

Utilizando o Boss (Dependency manager for Delphi) é possível instalar a biblioteca de forma automática.

pascal
boss install github.com/antoniojmsjr/Horse-XMLDoc

⚙️ Instalação Manual

Se você optar por instalar manualmente, basta adicionar as seguintes pastas ao seu projeto, em Project > Options > Delphi Compiler > Target > All Configurations > Search path

pascal
..\Horse-XMLDoc\Source

⚡️ Uso

Uso e definição do middleware

delphi
uses Horse, Horse.XMLDoc, Xml.XMLDoc;

THorse
  .Use(THorseXMLDoc.New
       .DOMVendor(TDOMVendorType.MsXML)
       .ContentTypeXML(['application/xhtml+xml'])
       .Encoding('utf-8')
       .Intercept);
OU

THorse
  .Use(THorseXMLDoc.New.Intercept);
delphi
THorseXMLDoc.New
  .DOMVendor(...)
  .ContentTypeXML([...])
  .Encoding(...)
  .Intercept;
  • DOMVendor: Identificação do motor de processsamento do XML. Verificar
    • Default: TDOMVendorType.MsXML (Ambiente Microsoft Windows) / TDOMVendorType.OmniXML (Ambiente Cross-platform)
  • ContentTypeXML: Identificação do MIME types que serão interceptados pelo middleware.
    • Default: application/xml e text/xml
  • Encoding: Identificação do Encoding do documento XML.
    • Default: utf-8
  • Intercept: Função responsável pela interceptação e tratatamento das requisições com XML.

Os exemplos estão disponíveis na pasta do projeto:

pascal
..\Horse-XMLDoc\Samples

Exemplo

delphi
uses Horse, Horse.XMLDoc, Xml.XMLDoc;

THorse
  .Use(THorseXMLDoc.New.Intercept);

THorse.Post('ping',
  procedure(Req: THorseRequest; Res: THorseResponse)
  var
    lBodyXML: TXMLDocument;
  begin
    //Parse usando middleware Horse-XMLDoc
    lBodyXML := Req.Body<TXMLDocument>;
  
    Res.Send<TXMLDocument>(lBodyXML);  
  end);

Exemplo com manipulação

[!WARNING]
Para manipular o XML utilizando o middleware Horse-XMLDoc com o componente TXMLDocument é necessário instanciar a variável do componente TXMLDocument passando um container no create. Internamente o componente TXMLDocument utiliza interface para manipular o XML, e não informando um container a interface é eliminada pelo ARC do Delphi gerando alguns erros aleatórios, como, "No active document", "Invalid pointer operation" ou até mesmo o travamento do aplicativo.

delphi
var
  lXMLDoc: TXMLDocument;
begin
  lXMLDoc := TXMLDocument.Create(XMLContainer); // Container da unit Horse.XMLDoc

  ...
end;
xml
<books>
  <book>
    <author>Carson</author>
    <price format="dollar">31.95</price>
    <pubdate>05/01/2001</pubdate>
  </book>
</books>
delphi
uses Horse, Horse.XMLDoc, Xml.XMLDoc, Xml.Win.msxmldom, Xml.xmldom, Winapi.ActiveX;

THorse
  .Use(THorseXMLDoc.New.Intercept);

THorse.Get('ping',
  procedure(Req: THorseRequest; Res: THorseResponse)
  var
    lXMLDoc: TXMLDocument;
    lNodeBooks: IXMLNode;
    lNodeBook: IXMLNode;
    lNodeElement: IXMLNode;
    lNodeAttribute: IXMLNode;
  begin
    CoInitialize(nil); // Obrigatório quando DOMVendor = SMSXML
    try
      lXMLDoc := TXMLDocument.Create(XMLContainer); // Free pelo middleware Horse-XMLDoc depois do "Send".
      lXMLDoc.DOMVendor := GetDOMVendor(SMSXML);
      lXMLDoc.Active := True;
      lXMLDoc.Version := '1.0';
      lXMLDoc.Encoding := 'utf-8';

      //<books> - CRIA O NÓ RAIZ = lXMLDoc.DocumentElement
      lNodeBooks := lXMLDoc.AddChild('books');

      //<book>
      lNodeBook := lXMLDoc.CreateNode('book', ntElement);

      //<books>
      //  <book>
      lNodeBooks.ChildNodes.Add(lNodeBook);

      //<author>
      lNodeElement := lXMLDoc.CreateNode('author', ntElement);
      lNodeElement.Text := 'Carson';

      //<books>
      //  <book>
      //    <author>
      lNodeBook.ChildNodes.Add(lNodeElement);

      //<price>
      lNodeElement := lXMLDoc.CreateNode('price', ntElement);
      lNodeElement.Text := '31.95';

      //<price format="dollar">
      lNodeAttribute := lXMLDoc.CreateNode('format', ntAttribute);
      lNodeAttribute.Text := 'dollar';

      lNodeElement.AttributeNodes.Add(lNodeAttribute);

      //<books>
      //  <book>
      //    <price format="dollar">
      lNodeBook.ChildNodes.Add(lNodeElement);

      //<pubdate>
      lNodeElement := lXMLDoc.CreateNode('pubdate', ntElement);
      lNodeElement.Text := '05/01/2001';

      //<books>
      //  <book>
      //    <pubdate>
      lNodeBook.ChildNodes.Add(lNodeElement);

      pResponse.Send<TXMLDocument>(lXMLDoc);
    finally
      CoUninitialize;
    end;
  end);

Exemplo compilado

Demo.zip

⚠️ Licença

Horse-XMLDoc is free and open-source software licensed under the