翻譯|使用教程|編輯:吉煒煒|2025-05-07 11:48:18.827|閱讀 153 次
概述:目前,XML 和 JSON 格式已成為計算機系統間數據存儲和信息交換的主要標準。應用戶要求,FastScript 中已添加用于處理 XML 和 JSON 的類。在本文中,我們將深入研究如何使用這些類,探索它們的屬性和方法,以及如何使用腳本從代碼創建報告。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
目前,XML 和 JSON 格式已成為計算機系統間數據存儲和信息交換的主要標準。應用戶要求,FastScript 中已添加用于處理 XML 和 JSON 的類。在本文中,我們將深入研究如何使用這些類,探索它們的屬性和方法,以及如何使用腳本從代碼創建報告。
為了在腳本中使用 XML,需要使用兩個類。這兩個類專注于最高速度和低內存消耗。
TfrXMLDocument – 封裝 XML 文檔功能的類。它包含以下屬性和方法。
類的屬性和方法 | 描述 |
procedure SaveToStream(Stream: TStream); | 將 XML 保存到傳遞的流中。 |
procedure LoadFromStream(Stream: TStream; AllowPartialLoading: Boolean = False); | 從傳遞的流中加載 XML。 |
procedure SaveToFile(const FileName: string); | 將 XML 保存到具有指定名稱的文件中。 |
procedure LoadFromFile(const FileName: string); | 從具有指定名稱的文件中加載 XML。 |
procedure Clear; | 刪除樹中除根節點之外的所有 XML 節點。節點的內容不會被清除。 |
property Root: TfrXMLItem; | 允許訪問樹的根元素。 |
property AsText: string; | 允許您獲取和設置 XML 作為字符串(例如,使用此屬性,您可以使用報告變量將 XML 傳遞給報告腳本)。 |
property AutoIndent: Boolean; | 確定如何生成輸出 XML:作為單行還是作為縮進文本。 |
TfrXMLNode – 封裝 XML 文檔節點屬性的類。
您無法直接創建此類型的對象。它是通過調用要添加子元素的元素的 Add() 方法來創建的。讓我們仔細看看 TfrXMLNode 類的屬性和方法。
類的屬性和方法 | 描述 |
function Add(AName:string):TfrXMLItem; | 創建具有指定名稱的子 TfrXMLItem 并返回它。 |
procedure Clear; | 清除子元素列表。 |
procedure InsertItem(Index:integer; AItem: TfrXMLItem); | 將子元素插入到指定位置。該元素可能屬于另一個文檔。 |
function Find(AName:string):Integer; | 在子元素中搜索指定名稱的 TfrXMLItem 并返回。如果未找到,則返回 -1。如果有多個指定名稱的元素,則返回第一個。 |
function FindItem(AName:string):TfrXMLItem; | 在子元素中搜索指定名稱的 TfrXMLItem 并返回。如果未找到,則創建并返回一個指定名稱的新元素。如果有多個指定名稱的元素,則返回第一個。 |
function Root: TfrXMLItem; | 返回文檔的根元素。 |
property Count:Integer; | 返回元素的子節點的數量。 |
property Items[AIndex:Integer]: TfrXMLItem; | 根據索引返回子元素。 |
property Prop[AName:string]:string; | 返回或設置具有指定名稱的節點屬性的值。 |
property Name: string; | 元素的標簽名稱。 |
property Parent: TfrXMLItem; | 父元素的名稱。Root 為 nil。 |
property Text:string; | 包含節點參數列表的字符串,格式為 Name1="Value1" Name2="Value2"… 此字符串中的特殊字符用引號引起來。 |
procedure Delete(AIndex: Integer); | 刪除具有 AIndex 的子元素。 |
procedure DeleteProp(const APropName: string); | 刪除具有指定名稱的節點的屬性。 |
property Value: string; | 位于元素的開始和結束標記之間的文本。 |
function PropExists(APropName:string):Boolean; | 幫助確定元素是否具有指定名稱的屬性。 |
function IndexOf(AItem: TfrXMLItem):Integer; | 返回傳遞元素的索引。 |
function GetPropNames(ANames:TStrings); | 使用 TfrXMLItem 屬性的名稱填充傳遞的字符串列表。 |
讓我們嘗試使用用于處理 XML 的類來構建一個報表。例如,我們將在報表中顯示來自“country.xml”文件的數據,但我們不會使用 TClientDataSet,而是直接訪問 XML 文件。我們創建一個新報表,進入編輯模式,將 MasterData 添加到報表中。并在頂部添加幾個 Memo 來顯示數據。我們還將為 MasterData 對象創建一個 OnBeforePrint 事件。
最終的報告腳本代碼將如下所示:
var doc: TfrXMLDocument; item: TfrXMLItem; IIndex: Integer; procedure MasterData1OnBeforePrint(Sender: TfrxComponent); var cur: TfrXMLItem; S: string; begin cur := item[IIndex]; mmNum.Text := cur.Prop['Code']; mmName.Text := cur.Prop['Name']; mmCapital.Text := cur.Prop['Capital']; mmArea.Text := cur.Prop['Area']; mmPopulation.Text := cur.Prop['Population']; mmContinent.Text := cur.Prop['Continent']; Inc(IIndex); end; begin Doc := TfrXMLDocument.Create; Doc.LoadFromFile('..\..\Data\country.xml'); item := Doc.Root[1]; IIndex := 0; MasterData1.RowCount := item.count; end.
讓我們繼續運行報告。為了更易于閱讀,我們還添加了列標題。
讓我們順利地從 XML 過渡到 JSON 格式。為了在 FastReport 中使用 JSON,還需要用到兩個類—— TfrJSON和TfrJSONArray。在本例中,這兩個類只是 Delphi 平臺中 System.JSON 類或 Lazarus 中類似類的包裝器。
TfrJSONObject — 封裝用于處理 JSON 對象的函數的類。
類的屬性和方法 | 描述 |
function Create(const JSONstring: string); | 創建一個 JSON 對象并根據提供的字符串填充它。 |
function IsValid:Boolean; | 如果對象包含有效的 JSON,則返回 True。 |
procedure LodFromFile(const AFilName:string); | 從指定文件加載數據。如果對象包含數據,則數據將會丟失。 |
procedure LoadFromtStream(const AStream:TStream); | 從提供的流中加載數據。如果對象包含數據,則數據將會丟失。 |
function ToString:string; | 返回包含 JSON 對象的文本表示形式的字符串。 |
procedure SaveToFile(const AFileName: string); | 將 JSON 對象的文本表示保存到文件。 |
procedure SaveToStream(AStream: TStream | 將 JSON 對象的文本表示保存到流中。 |
function IsNameExists(const AName:string); | 如果對象具有指定名稱的屬性,則返回 True。 |
function IsNameValueExists(const Name, Value: string): boolean; | 如果對象具有指定名稱的屬性并且其值與指定值匹配,則返回 True。 |
function Count:Integer; | 返回 JSON 對象中的屬性總數。 |
property Names[AIndex:Integer]:string; | 返回指定索引處的屬性的名稱。 |
Property ValueType[IndexOrName:Variant]:TfrJSONType; |
返回指定索引或名稱處屬性的類型。該類型可以是以下值之一: - jsUnknown - 屬性類型未知(發生解析錯誤或缺少具有此類索引或名稱的屬性)。- jsNumber - 屬性為數字類型。- jsString - 屬性為字符串類型。- jsBoolean - 屬性為布爾類型 (true/false)。- jsNull - 屬性類型為空(未分配值)。- jsList - 屬性類型為 JSON 數組。- jsObject - 屬性類型為嵌套 JSON 對象。 |
以下屬性允許您以某種形式檢索 JSON 對象的值。在所有這些屬性中,索引都是通過屬性列表中的屬性編號或其名稱執行的。請注意AsString['1'] <> AsString[1]。此外,如果您嘗試使用不合適的方法獲取屬性值,則可能會發生錯誤并返回錯誤的屬性值。例如,如果屬性的類型為“Object”或“Array”,那么當您嘗試使用 AsString 屬性獲取其值時,您將得到一個空字符串。在其他情況下,AsString 將返回屬性值的字符串表示形式。
類的屬性和方法 | 描述 |
property AsObject[IndexOrName: Variant]: TfrxJSON; | 允許您檢索嵌套的 JSON 對象。 |
property AsArray[IndexOrName: Variant]: TfrJSONArray; | 允許您檢索嵌套的 JSON 數組。 |
Property AsString[IndexOrName: Variant]: string; | 允許您以字符串形式檢索屬性值。此檢索方法適用于除對象和數組之外的其他類型的屬性。對于布爾值,將返回包含“True”或“False”值的字符串。對于包含小數部分的數字,無論區域設置如何,始終使用點作為小數部分的分隔符。 |
property AsNumber[IndexOrName: Variant]: Extended; | 允許您以數字形式檢索屬性的值。如果屬性為非數字類型,則返回 0。 |
property AsBoolean[IndexOrName: Variant]: Boolean; | 允許您以布爾值的形式檢索屬性的值。如果屬性屬于其他類型,則返回 False。 |
要返回 null 類型的字段,您需要付出一些努力。目前沒有專門的方法來實現這一點。但是,您可以使用 ValueType 屬性,該屬性會為 null 類型的字段返回 jsNull;或者使用 AsString 屬性,該屬性會返回字符串“null”。
讓我們仔細看看操作對象屬性的方法。
類方法 | 描述 |
Procedure Delete(AName: String); | 從對象中刪除具有指定名稱的屬性。 |
function AddObject(const AName: string): Integer | 向對象添加具有指定名稱的子空對象。 |
function AddArray(const AName: string): Integer; | 將具有指定名稱的空數組添加到對象。 |
function AddString(const AName, AValue: string): Integer; | 將具有指定名稱的字符串添加到對象。 |
function AddBool(const AName: string; AValue: boolean): Integer; | 將具有指定名稱的布爾值添加到對象。 |
function AddNumber(const AName: string; AValue:Extended): Integer; | 將具有指定名稱的數值實數添加到對象。 |
function AddInteger(const AName: string; AValue:Integer): Integer; | 將具有指定名稱的數字整數值添加到對象。 |
function AddNull(const AName: string): Integer; | 向對象添加具有指定名稱的空值。 |
該方法返回一個整數,它是所有字段列表中添加的元素的索引。
所有向對象添加字段的方法都不會控制現有同名字段的存在。此過程由使用此類的程序員負責。這種控制對于防止輸出 JSON 中出現多個同名字段至關重要。在這種情況下,系統的行為是不確定的——它取決于進一步解析接收 JSON 的解析器。這意味著可以使用任何同名的值!
TJSONArray類封裝了用于處理 JSON 數組的方法和屬性。主要屬性原則上相同,但只能通過索引訪問它們。僅支持訪問元素、獲取元素值或刪除元素的操作。您無法移動數組中的元素或更改其類型。讓我們來研究一下此類中用于獲取元素值的屬性和方法。
類的屬性和方法 | 描述 |
function Count:Integer; | 返回數組中的元素數量。 |
property ValueType[AIndex: Integer]: TfrJSONType; | 返回具有指定索引的數組元素的類型。 |
property AsObject[AIndex: Integer]: TfrJSONObject; | 返回一個對象,以 JSON 對象的形式提供對數組元素的訪問。 |
Property AsArray[AIndex: Integer]: TfrJSONArray | 返回一個對象,以 JSON 數組的形式提供對數組元素的訪問。 |
property AsString[AIndex: Integer]: string; | 以字符串形式返回數組元素的值。 |
property AsNumber[AIndex: Integer]: Extended; | 以數字形式返回數組元素的值。 |
property AsBoolean[AIndex: Integer]: Boolean; | 以布爾值形式返回數組元素的值。 |
處理數組時,就像處理對象一樣,提取元素值時需要謹慎。根據值的類型,使用適當的方法來檢索它。
下面介紹操作 JSON 數組元素的方法。
類的屬性和方法 | 描述 |
procedure Delete(AIndex:Integer); | 刪除指定索引處的數組元素。 |
function AddObject: Integer; | 將嵌套的 JSON 對象添加到數組末尾。 |
function AddArray: Integer; | 將嵌套的 JSON 數組添加到數組末尾。 |
function AddString(const AValue: string): Integer; | 將字符串添加到數組末尾。 |
function AddBool(AValue: boolean): Integer; | 將布爾值添加到數組末尾。 |
function AddNumber(AValue:Extended): Integer; | 將浮點數添加到數組的末尾。 |
function AddInteger(AValue: Integer): Integer; | 將一個整數添加到數組的末尾。 |
function AddNull: Integer; | 將 null 添加到數組末尾。 |
所有這些方法都返回添加到數組的元素的位置。您無法將元素插入到數組的中間;這是 System.JSON 基類的限制。
使用對象時,務必記住,使用包裝對象后,必須將其從代碼中全部刪除。
請注意,如果您想要獲取子對象或數組,但實際獲取的是一個標量值或根本沒有值,則該屬性將返回 nil,并且在進一步訪問該屬性時將引發異常。請避免使用不適用于元素中存儲的特定類型值的方法來檢索這些值。
重要的是要注意,對象的屬性名稱區分大小寫,這意味著“Item1”和“item1”被視為不同的名稱!
只有當對象元素的值類型與元素定義的類型匹配時,您才能為其設置值。如果您需要重新定義元素的類型,請刪除該元素,然后添加一個具有相同名稱且類型為所需元素的新元素。無法為數組元素輸入新值。您需要刪除 JSON 數組,然后使用所需的值重新創建它。
讓我們使用上面描述中的類并編寫一個腳本,從 XML 文件中提取數據(不帶類型信息)并將其放入 JSON 對象中。
procedure XMLToJSON; var XML: TfrXMLDocument; xi, xi1: TfrXMLItem; I, J: Integer; JO: TfrJSONObject; JA, JA1: TfrJSONArray; SL: TStringList; begin XML:=TfrXMLDocument.Create; XML.LoadFromFile('.\..\..\data\country.xml'); JO:=TfrJSONObject.Create('{}'); JO.AddArray('data'); JA:=JO.AsArray['data']; xi:=X.Root[1]; xi1:=xi.Items[0]; SL:=TStringList.Create; xi1.GetParamNames(SL); for I:=0 to xi.Count - 1 do begin xi1:=xi.Items[I]; JA1:=JA.AsArray[JA.AddArray]; for J:=0 to SL.Count-1 do JA1.AddString(xi1.Prop[SL[J]]); JA1.Free; end; JA.Free; JO.SaveToFile('.\..\..\data\country.json'); JO.Free; SL.Free; end;
并且讓我們嘗試根據獲得的數據構建一份報告(首先,在報告頁面上放置適當的 MasterData 和 Memo 組件):
var J:TfrJSONObject; A:TfrJSONArray; curr:Integer; procedure MasterData1OnBeforePrint(Sender: TfrxComponent); var A1:TfrJSONArray; begin A1:=A.AsArray(curr); Memo1.Memo.Text:=A1.AsString[0]; Memo2.Memo.Text:=A1.AsString[1]; Memo3.Memo.Text:=A1.AsString[2]; Memo4.Memo.Text:=A1.AsString[3]; Memo5.Memo.Text:=A1.AsString[4]; Memo6.Memo.Text:=A1.AsString[5]; A1.Free; curr := curr + 1; end; begin J:=TfrJSONObject.Create(''); J.LoadFromFile('.\..\..\data\country.json'); A:=J.AsArray[0]; MasterData1.RowCount:=A.Count; curr:=0; end.
您還可以在 Delphi 代碼中使用這些對象 - 只需在 uses 語句中包含 frXML 和 frJSON 模塊。
在本文中,我們探討了在 FastReport 中使用類來處理 JSON 和 XML。如果您不僅使用報表,還使用 Delphi 和 Lazarus,那么使用這些類將有助于最大限度地減少在環境之間切換時出現的問題——您的體驗將在兩個 IDE 上保持一致。
_________________________________________________________
關于慧都科技:
慧都科技是一家行業數字化解決方案公司,長期專注于軟件、油氣與制造行業。公司基于深入的業務理解與管理洞察,以系統化的業務建模驅動技術落地,幫助企業實現智能化運營與長期競爭優勢。在軟件工程領域,我們提供開發控件、研發管理、代碼開發、部署運維等軟件開發全鏈路所需的產品,提供正版授權采購、技術選型、個性化維保等服務,幫助客戶實現技術合規、降本增效與風險可控。慧都科技是FastReports的在中國區的合作伙伴,FastReports作為圖表報表領域的優秀產品,幫助企業實現輕松構建高性能的表格及圖表。
下載或體驗FastReport產品,請咨詢,或撥打產品熱線:023-68661681
歡迎加入FastReport技術QQ群:170305738,與更多小伙伴探討報表開發技能。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網