翻譯|使用教程|編輯:吉煒煒|2025-05-07 11:48:18.827|閱讀 153 次
概述:目前,XML 和 JSON 格式已成為計(jì)算機(jī)系統(tǒng)間數(shù)據(jù)存儲和信息交換的主要標(biāo)準(zhǔn)。應(yīng)用戶要求,F(xiàn)astScript 中已添加用于處理 XML 和 JSON 的類。在本文中,我們將深入研究如何使用這些類,探索它們的屬性和方法,以及如何使用腳本從代碼創(chuàng)建報(bào)告。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
目前,XML 和 JSON 格式已成為計(jì)算機(jī)系統(tǒng)間數(shù)據(jù)存儲和信息交換的主要標(biāo)準(zhǔn)。應(yīng)用戶要求,FastScript 中已添加用于處理 XML 和 JSON 的類。在本文中,我們將深入研究如何使用這些類,探索它們的屬性和方法,以及如何使用腳本從代碼創(chuàng)建報(bào)告。
為了在腳本中使用 XML,需要使用兩個(gè)類。這兩個(gè)類專注于最高速度和低內(nèi)存消耗。
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; | 刪除樹中除根節(jié)點(diǎn)之外的所有 XML 節(jié)點(diǎn)。節(jié)點(diǎn)的內(nèi)容不會被清除。 |
property Root: TfrXMLItem; | 允許訪問樹的根元素。 |
property AsText: string; | 允許您獲取和設(shè)置 XML 作為字符串(例如,使用此屬性,您可以使用報(bào)告變量將 XML 傳遞給報(bào)告腳本)。 |
property AutoIndent: Boolean; | 確定如何生成輸出 XML:作為單行還是作為縮進(jìn)文本。 |
TfrXMLNode – 封裝 XML 文檔節(jié)點(diǎn)屬性的類。
您無法直接創(chuàng)建此類型的對象。它是通過調(diào)用要添加子元素的元素的 Add() 方法來創(chuàng)建的。讓我們仔細(xì)看看 TfrXMLNode 類的屬性和方法。
類的屬性和方法 | 描述 |
function Add(AName:string):TfrXMLItem; | 創(chuàng)建具有指定名稱的子 TfrXMLItem 并返回它。 |
procedure Clear; | 清除子元素列表。 |
procedure InsertItem(Index:integer; AItem: TfrXMLItem); | 將子元素插入到指定位置。該元素可能屬于另一個(gè)文檔。 |
function Find(AName:string):Integer; | 在子元素中搜索指定名稱的 TfrXMLItem 并返回。如果未找到,則返回 -1。如果有多個(gè)指定名稱的元素,則返回第一個(gè)。 |
function FindItem(AName:string):TfrXMLItem; | 在子元素中搜索指定名稱的 TfrXMLItem 并返回。如果未找到,則創(chuàng)建并返回一個(gè)指定名稱的新元素。如果有多個(gè)指定名稱的元素,則返回第一個(gè)。 |
function Root: TfrXMLItem; | 返回文檔的根元素。 |
property Count:Integer; | 返回元素的子節(jié)點(diǎn)的數(shù)量。 |
property Items[AIndex:Integer]: TfrXMLItem; | 根據(jù)索引返回子元素。 |
property Prop[AName:string]:string; | 返回或設(shè)置具有指定名稱的節(jié)點(diǎn)屬性的值。 |
property Name: string; | 元素的標(biāo)簽名稱。 |
property Parent: TfrXMLItem; | 父元素的名稱。Root 為 nil。 |
property Text:string; | 包含節(jié)點(diǎn)參數(shù)列表的字符串,格式為 Name1="Value1" Name2="Value2"… 此字符串中的特殊字符用引號引起來。 |
procedure Delete(AIndex: Integer); | 刪除具有 AIndex 的子元素。 |
procedure DeleteProp(const APropName: string); | 刪除具有指定名稱的節(jié)點(diǎn)的屬性。 |
property Value: string; | 位于元素的開始和結(jié)束標(biāo)記之間的文本。 |
function PropExists(APropName:string):Boolean; | 幫助確定元素是否具有指定名稱的屬性。 |
function IndexOf(AItem: TfrXMLItem):Integer; | 返回傳遞元素的索引。 |
function GetPropNames(ANames:TStrings); | 使用 TfrXMLItem 屬性的名稱填充傳遞的字符串列表。 |
讓我們嘗試使用用于處理 XML 的類來構(gòu)建一個(gè)報(bào)表。例如,我們將在報(bào)表中顯示來自“country.xml”文件的數(shù)據(jù),但我們不會使用 TClientDataSet,而是直接訪問 XML 文件。我們創(chuàng)建一個(gè)新報(bào)表,進(jìn)入編輯模式,將 MasterData 添加到報(bào)表中。并在頂部添加幾個(gè) Memo 來顯示數(shù)據(jù)。我們還將為 MasterData 對象創(chuàng)建一個(gè) OnBeforePrint 事件。
最終的報(bào)告腳本代碼將如下所示:
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.
讓我們繼續(xù)運(yùn)行報(bào)告。為了更易于閱讀,我們還添加了列標(biāo)題。
讓我們順利地從 XML 過渡到 JSON 格式。為了在 FastReport 中使用 JSON,還需要用到兩個(gè)類—— TfrJSON和TfrJSONArray。在本例中,這兩個(gè)類只是 Delphi 平臺中 System.JSON 類或 Lazarus 中類似類的包裝器。
TfrJSONObject — 封裝用于處理 JSON 對象的函數(shù)的類。
類的屬性和方法 | 描述 |
function Create(const JSONstring: string); | 創(chuàng)建一個(gè) JSON 對象并根據(jù)提供的字符串填充它。 |
function IsValid:Boolean; | 如果對象包含有效的 JSON,則返回 True。 |
procedure LodFromFile(const AFilName:string); | 從指定文件加載數(shù)據(jù)。如果對象包含數(shù)據(jù),則數(shù)據(jù)將會丟失。 |
procedure LoadFromtStream(const AStream:TStream); | 從提供的流中加載數(shù)據(jù)。如果對象包含數(shù)據(jù),則數(shù)據(jù)將會丟失。 |
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 對象中的屬性總數(shù)。 |
property Names[AIndex:Integer]:string; | 返回指定索引處的屬性的名稱。 |
Property ValueType[IndexOrName:Variant]:TfrJSONType; |
返回指定索引或名稱處屬性的類型。該類型可以是以下值之一: - jsUnknown - 屬性類型未知(發(fā)生解析錯(cuò)誤或缺少具有此類索引或名稱的屬性)。- jsNumber - 屬性為數(shù)字類型。- jsString - 屬性為字符串類型。- jsBoolean - 屬性為布爾類型 (true/false)。- jsNull - 屬性類型為空(未分配值)。- jsList - 屬性類型為 JSON 數(shù)組。- jsObject - 屬性類型為嵌套 JSON 對象。 |
以下屬性允許您以某種形式檢索 JSON 對象的值。在所有這些屬性中,索引都是通過屬性列表中的屬性編號或其名稱執(zhí)行的。請注意AsString['1'] <> AsString[1]。此外,如果您嘗試使用不合適的方法獲取屬性值,則可能會發(fā)生錯(cuò)誤并返回錯(cuò)誤的屬性值。例如,如果屬性的類型為“Object”或“Array”,那么當(dāng)您嘗試使用 AsString 屬性獲取其值時(shí),您將得到一個(gè)空字符串。在其他情況下,AsString 將返回屬性值的字符串表示形式。
類的屬性和方法 | 描述 |
property AsObject[IndexOrName: Variant]: TfrxJSON; | 允許您檢索嵌套的 JSON 對象。 |
property AsArray[IndexOrName: Variant]: TfrJSONArray; | 允許您檢索嵌套的 JSON 數(shù)組。 |
Property AsString[IndexOrName: Variant]: string; | 允許您以字符串形式檢索屬性值。此檢索方法適用于除對象和數(shù)組之外的其他類型的屬性。對于布爾值,將返回包含“True”或“False”值的字符串。對于包含小數(shù)部分的數(shù)字,無論區(qū)域設(shè)置如何,始終使用點(diǎn)作為小數(shù)部分的分隔符。 |
property AsNumber[IndexOrName: Variant]: Extended; | 允許您以數(shù)字形式檢索屬性的值。如果屬性為非數(shù)字類型,則返回 0。 |
property AsBoolean[IndexOrName: Variant]: Boolean; | 允許您以布爾值的形式檢索屬性的值。如果屬性屬于其他類型,則返回 False。 |
要返回 null 類型的字段,您需要付出一些努力。目前沒有專門的方法來實(shí)現(xiàn)這一點(diǎn)。但是,您可以使用 ValueType 屬性,該屬性會為 null 類型的字段返回 jsNull;或者使用 AsString 屬性,該屬性會返回字符串“null”。
讓我們仔細(xì)看看操作對象屬性的方法。
類方法 | 描述 |
Procedure Delete(AName: String); | 從對象中刪除具有指定名稱的屬性。 |
function AddObject(const AName: string): Integer | 向?qū)ο筇砑泳哂兄付Q的子空對象。 |
function AddArray(const AName: string): Integer; | 將具有指定名稱的空數(shù)組添加到對象。 |
function AddString(const AName, AValue: string): Integer; | 將具有指定名稱的字符串添加到對象。 |
function AddBool(const AName: string; AValue: boolean): Integer; | 將具有指定名稱的布爾值添加到對象。 |
function AddNumber(const AName: string; AValue:Extended): Integer; | 將具有指定名稱的數(shù)值實(shí)數(shù)添加到對象。 |
function AddInteger(const AName: string; AValue:Integer): Integer; | 將具有指定名稱的數(shù)字整數(shù)值添加到對象。 |
function AddNull(const AName: string): Integer; | 向?qū)ο筇砑泳哂兄付Q的空值。 |
該方法返回一個(gè)整數(shù),它是所有字段列表中添加的元素的索引。
所有向?qū)ο筇砑幼侄蔚姆椒ǘ疾粫刂片F(xiàn)有同名字段的存在。此過程由使用此類的程序員負(fù)責(zé)。這種控制對于防止輸出 JSON 中出現(xiàn)多個(gè)同名字段至關(guān)重要。在這種情況下,系統(tǒng)的行為是不確定的——它取決于進(jìn)一步解析接收 JSON 的解析器。這意味著可以使用任何同名的值!
TJSONArray類封裝了用于處理 JSON 數(shù)組的方法和屬性。主要屬性原則上相同,但只能通過索引訪問它們。僅支持訪問元素、獲取元素值或刪除元素的操作。您無法移動數(shù)組中的元素或更改其類型。讓我們來研究一下此類中用于獲取元素值的屬性和方法。
類的屬性和方法 | 描述 |
function Count:Integer; | 返回?cái)?shù)組中的元素?cái)?shù)量。 |
property ValueType[AIndex: Integer]: TfrJSONType; | 返回具有指定索引的數(shù)組元素的類型。 |
property AsObject[AIndex: Integer]: TfrJSONObject; | 返回一個(gè)對象,以 JSON 對象的形式提供對數(shù)組元素的訪問。 |
Property AsArray[AIndex: Integer]: TfrJSONArray | 返回一個(gè)對象,以 JSON 數(shù)組的形式提供對數(shù)組元素的訪問。 |
property AsString[AIndex: Integer]: string; | 以字符串形式返回?cái)?shù)組元素的值。 |
property AsNumber[AIndex: Integer]: Extended; | 以數(shù)字形式返回?cái)?shù)組元素的值。 |
property AsBoolean[AIndex: Integer]: Boolean; | 以布爾值形式返回?cái)?shù)組元素的值。 |
處理數(shù)組時(shí),就像處理對象一樣,提取元素值時(shí)需要謹(jǐn)慎。根據(jù)值的類型,使用適當(dāng)?shù)姆椒▉頇z索它。
下面介紹操作 JSON 數(shù)組元素的方法。
類的屬性和方法 | 描述 |
procedure Delete(AIndex:Integer); | 刪除指定索引處的數(shù)組元素。 |
function AddObject: Integer; | 將嵌套的 JSON 對象添加到數(shù)組末尾。 |
function AddArray: Integer; | 將嵌套的 JSON 數(shù)組添加到數(shù)組末尾。 |
function AddString(const AValue: string): Integer; | 將字符串添加到數(shù)組末尾。 |
function AddBool(AValue: boolean): Integer; | 將布爾值添加到數(shù)組末尾。 |
function AddNumber(AValue:Extended): Integer; | 將浮點(diǎn)數(shù)添加到數(shù)組的末尾。 |
function AddInteger(AValue: Integer): Integer; | 將一個(gè)整數(shù)添加到數(shù)組的末尾。 |
function AddNull: Integer; | 將 null 添加到數(shù)組末尾。 |
所有這些方法都返回添加到數(shù)組的元素的位置。您無法將元素插入到數(shù)組的中間;這是 System.JSON 基類的限制。
使用對象時(shí),務(wù)必記住,使用包裝對象后,必須將其從代碼中全部刪除。
請注意,如果您想要獲取子對象或數(shù)組,但實(shí)際獲取的是一個(gè)標(biāo)量值或根本沒有值,則該屬性將返回 nil,并且在進(jìn)一步訪問該屬性時(shí)將引發(fā)異常。請避免使用不適用于元素中存儲的特定類型值的方法來檢索這些值。
重要的是要注意,對象的屬性名稱區(qū)分大小寫,這意味著“Item1”和“item1”被視為不同的名稱!
只有當(dāng)對象元素的值類型與元素定義的類型匹配時(shí),您才能為其設(shè)置值。如果您需要重新定義元素的類型,請刪除該元素,然后添加一個(gè)具有相同名稱且類型為所需元素的新元素。無法為數(shù)組元素輸入新值。您需要?jiǎng)h除 JSON 數(shù)組,然后使用所需的值重新創(chuàng)建它。
讓我們使用上面描述中的類并編寫一個(gè)腳本,從 XML 文件中提取數(shù)據(jù)(不帶類型信息)并將其放入 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;
并且讓我們嘗試根據(jù)獲得的數(shù)據(jù)構(gòu)建一份報(bào)告(首先,在報(bào)告頁面上放置適當(dāng)?shù)?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。如果您不僅使用報(bào)表,還使用 Delphi 和 Lazarus,那么使用這些類將有助于最大限度地減少在環(huán)境之間切換時(shí)出現(xiàn)的問題——您的體驗(yàn)將在兩個(gè) IDE 上保持一致。
_________________________________________________________
關(guān)于慧都科技:
慧都科技是一家行業(yè)數(shù)字化解決方案公司,長期專注于軟件、油氣與制造行業(yè)。公司基于深入的業(yè)務(wù)理解與管理洞察,以系統(tǒng)化的業(yè)務(wù)建模驅(qū)動技術(shù)落地,幫助企業(yè)實(shí)現(xiàn)智能化運(yùn)營與長期競爭優(yōu)勢。在軟件工程領(lǐng)域,我們提供開發(fā)控件、研發(fā)管理、代碼開發(fā)、部署運(yùn)維等軟件開發(fā)全鏈路所需的產(chǎn)品,提供正版授權(quán)采購、技術(shù)選型、個(gè)性化維保等服務(wù),幫助客戶實(shí)現(xiàn)技術(shù)合規(guī)、降本增效與風(fēng)險(xiǎn)可控。慧都科技是FastReports的在中國區(qū)的合作伙伴,F(xiàn)astReports作為圖表報(bào)表領(lǐng)域的優(yōu)秀產(chǎn)品,幫助企業(yè)實(shí)現(xiàn)輕松構(gòu)建高性能的表格及圖表。
下載或體驗(yàn)FastReport產(chǎn)品,請咨詢,或撥打產(chǎn)品熱線:023-68661681
歡迎加入FastReport技術(shù)QQ群:170305738,與更多小伙伴探討報(bào)表開發(fā)技能。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)