Awesome
</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.
⚙️ 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
[!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.
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
⚠️ Licença
Horse-XMLDoc
is free and open-source software licensed under the