Codeunit 1239 XML Buffer Reader, source in 29
Source29
src/Layers/W1/BaseApp/System/DataExchange/XMLBufferReader.Codeunit.al123 lines, Copyright (c) Microsoft Corporation. MIT
namespace System.IO;
using System;
using System.Utilities;
using System.Xml;
codeunit 1239 "XML Buffer Reader"
{
trigger OnRun()
begin
end;
var
DefaultNamespace: Text;
[TryFunction]
[Scope('OnPrem')]
procedure SaveToFile(FilePath: Text; var XMLBuffer: Record "XML Buffer")
var
TempBlob: Codeunit "Temp Blob";
FileMgt: Codeunit "File Management";
begin
SaveToTempBlobWithEncoding(TempBlob, XMLBuffer, 'UTF-8');
FileMgt.BLOBExportToServerFile(TempBlob, FilePath);
end;
[TryFunction]
procedure SaveToTempBlob(var TempBlob: Codeunit "Temp Blob"; var XMLBuffer: Record "XML Buffer")
begin
SaveToTempBlobWithEncoding(TempBlob, XMLBuffer, 'UTF-8');
end;
[TryFunction]
procedure SaveToTempBlobWithEncoding(var TempBlob: Codeunit "Temp Blob"; var XMLBuffer: Record "XML Buffer"; Encoding: Text)
var
TempXMLBuffer: Record "XML Buffer" temporary;
TempAttributeXMLBuffer: Record "XML Buffer" temporary;
XMLDOMManagement: Codeunit "XML DOM Management";
XmlDocument: DotNet XmlDocument;
RootElement: DotNet XmlNode;
OutStr: OutStream;
Header: Text;
begin
TempXMLBuffer.CopyImportFrom(XMLBuffer);
TempXMLBuffer := XMLBuffer;
TempXMLBuffer.SetCurrentKey("Parent Entry No.", Type, "Node Number");
Header := '<?xml version="1.0" encoding="' + Encoding + '"?>' +
'<' + TempXMLBuffer.GetElementName() + ' ';
DefaultNamespace := TempXMLBuffer.GetAttributeValueAsText('xmlns');
if TempXMLBuffer.FindAttributes(TempAttributeXMLBuffer) then
repeat
Header += TempAttributeXMLBuffer.Name + '="' + TempAttributeXMLBuffer.GetValue() + '" ';
until TempAttributeXMLBuffer.Next() = 0;
Header += '/>';
XMLDOMManagement.LoadXMLDocumentFromText(Header, XmlDocument);
RootElement := XmlDocument.DocumentElement;
SaveChildElements(TempXMLBuffer, RootElement, XmlDocument);
TempBlob.CreateOutStream(OutStr);
XmlDocument.Save(OutStr);
end;
local procedure SaveChildElements(var TempParentElementXMLBuffer: Record "XML Buffer" temporary; XMLCurrElement: DotNet XmlNode; XmlDocument: DotNet XmlDocument)
var
TempElementXMLBuffer: Record "XML Buffer" temporary;
ChildElement: DotNet XmlNode;
NamespaceURI: Text;
ElementValue: Text;
begin
if TempParentElementXMLBuffer.FindChildElements(TempElementXMLBuffer) then
repeat
if TempElementXMLBuffer.Namespace = '' then
NamespaceURI := DefaultNamespace
else
NamespaceURI := TempParentElementXMLBuffer.GetNamespaceUriByPrefixAsText(TempElementXMLBuffer.Namespace);
ChildElement := XmlDocument.CreateElement(TempElementXMLBuffer.GetElementName(), NamespaceURI);
ElementValue := TempElementXMLBuffer.GetValue();
if ElementValue <> '' then
ChildElement.InnerText := ElementValue;
XMLCurrElement.AppendChild(ChildElement);
SaveProcessingInstructions(TempElementXMLBuffer, ChildElement, XmlDocument);
SaveAttributes(TempElementXMLBuffer, ChildElement, XmlDocument);
SaveChildElements(TempElementXMLBuffer, ChildElement, XmlDocument);
until TempElementXMLBuffer.Next() = 0;
end;
procedure SaveAttributes(var TempParentElementXMLBuffer: Record "XML Buffer" temporary; XMLCurrElement: DotNet XmlNode; XmlDocument: DotNet XmlDocument)
var
TempAttributeXMLBuffer: Record "XML Buffer" temporary;
Attribute: DotNet XmlAttribute;
NamespaceURI: Text;
begin
NamespaceURI := '';
if TempParentElementXMLBuffer.FindAttributes(TempAttributeXMLBuffer) then
repeat
if TempAttributeXMLBuffer.Namespace <> '' then
NamespaceURI := TempParentElementXMLBuffer.GetNamespaceUriByPrefixAsText(TempAttributeXMLBuffer.Namespace);
if NamespaceURI <> '' then
Attribute := XmlDocument.CreateAttribute(TempAttributeXMLBuffer.Name, NamespaceURI)
else
Attribute := XmlDocument.CreateAttribute(TempAttributeXMLBuffer.Name);
Attribute.InnerText := TempAttributeXMLBuffer.GetValue();
XMLCurrElement.Attributes.SetNamedItem(Attribute);
until TempAttributeXMLBuffer.Next() = 0;
end;
procedure SaveProcessingInstructions(var TempParentElementXMLBuffer: Record "XML Buffer" temporary; XMLCurrElement: DotNet XmlNode; XmlDocument: DotNet XmlDocument)
var
TempXMLBuffer: Record "XML Buffer" temporary;
ProcessingInstruction: DotNet XmlProcessingInstruction;
begin
if TempParentElementXMLBuffer.FindProcessingInstructions(TempXMLBuffer) then
repeat
ProcessingInstruction := XmlDocument.CreateProcessingInstruction(TempXMLBuffer.Name, TempXMLBuffer.GetValue());
XMLCurrElement.AppendChild(ProcessingInstruction);
until TempXMLBuffer.Next() = 0;
end;
}