Skip to content

antoniojmsjr/Horse-XMLDoc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Maintained YES Memory Leak Verified YES Release Stars Forks Issues
Compatibility Delphi Supported Versions

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.

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

..\Horse-XMLDoc\Source

⚡️ Uso

Uso e definição do middleware

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);
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:

..\Horse-XMLDoc\Samples

Exemplo

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

ATENÇÃO: 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.

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

  ...
end;
<books>
  <book>
    <author>Carson</author>
    <price format="dollar">31.95</price>
    <pubdate>05/01/2001</pubdate>
  </book>
</books>
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 License

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages