您好,登錄后才能下訂單哦!
Delphi中怎么使用NativeXml處理XML,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
使用NativeXml的例子
3.1.例子A:XML的裝載、存儲(chǔ)和導(dǎo)出
這個(gè)例子顯示如何加載一個(gè)XML文檔,然后以可讀格式導(dǎo)出到一個(gè)TMemo領(lǐng)域。
拖放一個(gè)TEdit(Edit1),TButton(Button1)和一個(gè)TMemo到你的窗體,然后連接到下面的按鈕的OnClick事件代碼。填寫文件名到Edit1,然后按一下按鈕,您會(huì)看到在memo控件中列出XML文件的內(nèi)容。
procedure TForm1.Button1Click(Sender: TObject);
var
ADoc: TNativeXml;
begin
Memo1.Lines.Clear;
ADoc := TNativeXml.Create;
try
ADoc.LoadFromFile(Edit1.Text);
ADoc.XmlFormat := xfReadable;
Memo1.Lines.Text := ADoc.WriteToString;
finally
ADoc.Free;
end;
end;
注意,ADoc.XmlFormat:= xfReadable將確保該文件是以易讀的形式列出(以回車符和縮進(jìn))。
3.2.例子B:連接到節(jié)點(diǎn)
這個(gè)例子顯示了如何訪問在XML文件中的各個(gè)節(jié)點(diǎn)。一個(gè)節(jié)點(diǎn)可以從一個(gè)普通的XML標(biāo)記、注釋、CDATA結(jié)構(gòu),等等東西。該示例演示如何使用一個(gè)簡(jiǎn)單的雙循環(huán)列出前2層的節(jié)點(diǎn)。
添加Tedit、TButton和TMemo到窗體,然后將下面的事件代碼連接到按鈕的OnClick。然后在Edit1中填寫文件名,按一下按鈕,前兩層的節(jié)點(diǎn)將會(huì)在memo控件中列出。
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
ADoc: TNativeXml;
begin
Memo1.Lines.Clear;
ADoc := TNativeXml.Create;
try
ADoc.LoadFromFile(Edit1.Text);
if assigned(ADoc.Root) then with ADoc.Root do
for i := 0 to NodeCount - 1 do begin
Memo1.Lines.Add(Nodes[i].Name);
for j := 0 to Nodes[i].NodeCount - 1 do
Memo1.Lines.Add(' ' + Nodes[i].Nodes[j].Name);
end;
finally
ADoc.Free;
end;
end;
3.3.例子C:事件驅(qū)動(dòng)處理
這個(gè)例子說明了NativeXml可以用一個(gè)SAX-like的方式,按順序讀文件,每當(dāng)一個(gè)節(jié)點(diǎn)初始化和加載時(shí)產(chǎn)生事件。
添加一個(gè)TButton(Button3)和一個(gè)TMemo(Memo1)到您的窗體,然后將NativeXml包括在uses中。接下來,鍵入下面的TButton.OnClick事件處理程序代碼。
procedure TForm1.Button3Click(Sender: TObject);
var
ADoc: TNativeXml;
begin
Memo1.Lines.Clear;
ADoc := TNativeXml.Create;
try
ADoc.OnNodeNew := DoNodeNew;
ADoc.OnNodeLoaded := DoNodeLoaded;
ADoc.LoadFromFile(Edit1.Text);
finally
ADoc.Free;
end;
end;
鍵入下面的程序代碼在新的TForm1中:
function TForm1.Indent(ACount: integer): string;
begin
while ACount > 0 do begin
Result := Result + ' ';
dec(ACount);
end;
end;
procedure TForm1.DoNodeNew(Sender: TObject; Node: TXmlNode);
begin
Memo1.Lines.Add(Format('New : %sName=%s', [Indent(Node.TreeDepth), Node.Name]));
end;
procedure TForm1.DoNodeLoaded(Sender: TObject; Node: TXmlNode);
begin
Memo1.Lines.Add(Format('Loaded: %sName=%s, Value=%s', [In dent(Node.TreeDepth), Node.Name, Node.ValueAsString]));
end;
當(dāng)一個(gè)節(jié)點(diǎn)被找到,OnNodeNew事件被觸發(fā),每當(dāng)一個(gè)節(jié)點(diǎn)完全裝載,OnNodeLoaded事件被觸發(fā)。
如果您不希望保留在內(nèi)存中的XML文件的完整副本,例如,對(duì)大型XML文件,你可以直接刪除該節(jié)點(diǎn),釋放其內(nèi)存。在這種情況下,添加以下代碼到OnNodeLoaded事件:
procedure TForm1.DoNodeLoaded(Sender: TObject; Node: TXmlNode);
begin
Memo1.Lines.Add(Format('Loaded: Name=%s, Value=%s', [Node.Name, Node.ValueAsString]));
if Node.TreeDepth > 0 then begin
Memo1.Lines.Add(Format('Deleted: Name=%s', [Node.Name]));
Node.Delete;
end;
end;
3.4.例子D:創(chuàng)建一個(gè)簡(jiǎn)單的XML文件
這個(gè)例子演示如何創(chuàng)建一個(gè)簡(jiǎn)單的XML文件,在根節(jié)點(diǎn)下的一個(gè)節(jié)點(diǎn),有一個(gè)屬性和子節(jié)點(diǎn)。我們將嘗試創(chuàng)建這個(gè)XML文件:
<?xml version="1.0" encoding="windows-1252"?>
<Root>
<Customer ID="123456">
<Name>John Doe</Name>
</Customer>
</Root>
下面是一個(gè)過程的代碼,創(chuàng)建此文件,并以易讀格式保存到一個(gè)文件名為“C:\test.xml”的文件:
procedure CreateXML;
var
ADoc: TNativeXml;
begin
// Create new document with a rootnode called "Root"
ADoc := TNativeXml.CreateName('Root');
try
// Add a subnode with name "Customer"
with ADoc.Root.NodeNew('Customer') do begin
// Add an attribute to this subnode
WriteAttributeInteger('ID', 123456);
// Add subsubnode
WriteString('Name', 'John Doe');
end;
// Save the XML in readable format (so with indents)
ADoc.XmlFormat := xfReadable;
// Save results to a file
ADoc.SaveToFile('c:\test.xml');
finally
ADoc.Free;
end;
end;
3.5.例子E:使用UTF8和Unicode編碼的文件(支持widestring)
這個(gè)例子顯示了如何創(chuàng)建和加載支持widestrings的XML文件。
3.5.1.NativeXml內(nèi)部編碼
NativeXml可以工作在兩種“模式”:要么所有的內(nèi)部字符串是普通的ANSI字符串或所有內(nèi)部字符串是UTF8編碼字符串。字符串類型不會(huì)改變(它仍然是“string”)。雖然Delphi7有一種特殊類型“Utf8String”,但沒有使用,以保持較低的Delphi版本的兼容性。
為了確保你的XML文檔可以使用widestrings,創(chuàng)建它,然后直接設(shè)置屬性“Utf8Encoded”為True,如下所示:
procedure CreateXML;
var
ADoc: TNativeXml;
begin
ADoc := TNativeXml.CreateName('Root');
try
// Make sure to be able to handle widestrings
ADoc.Utf8Encoded := True;
// ..add all your creation code here
finally
ADoc.Free;
end;
end;
3.5.2.NativeXml外部編碼
保存您的文檔時(shí),為外部文件或流選擇適當(dāng)?shù)木幋a(SaveToStream也需要正確的編碼保存)。設(shè)置屬性“ExternalEncoding”到其中的任何值:
se8bit:這將返回一個(gè)純ASCII文件,所有的Unicode/widestring字符值高于$FF。這是默認(rèn)值。
seUTF16LE:這將返回一個(gè)Unicode文件的字節(jié)順序標(biāo)記$FF FE。這應(yīng)該作為一個(gè)Unicode文件的默認(rèn)。
seUTF16BE:這將返回大字節(jié)(big-endian)Unicode文件的字節(jié)順序標(biāo)記$FE FF。
seUTF8:這將返回一個(gè)UTF-8編碼文件的字節(jié)順序標(biāo)記$FF BB BF。UTF-8在大部分字符為西方或拉丁語時(shí),是更好的存儲(chǔ)方式。然而,它可以為中文或日文等多種語言提供更多的空間。
這里有一個(gè)關(guān)于如何設(shè)置外部編碼的例子:
procedure CreateXML;
var
ADoc: TNativeXml;
begin
ADoc := TNativeXml.CreateName('Root');
try
// Make sure to be able to handle widestrings
ADoc.Utf8Encoded := True;
// ..add all your creation code here
// Save to unicode
ADoc.ExternalEncoding := seUTF16LE;
ADoc.EncodingString := 'UTF-16';
ADoc.SaveToFile('c:\temp\test.xml');
finally
ADoc.Free;
end;
end;
3.5.3.添加widestrings
添加widestrings到文檔很容易。每個(gè)節(jié)點(diǎn)的值可以設(shè)置為widestring,使用屬性的ValueAsWidestring,并可以在一般情況下使用FromWidestring函數(shù)添加widestrings。
下面的例子代碼,增加了一個(gè)新的節(jié)點(diǎn)到根,然后設(shè)置節(jié)點(diǎn)名字(Name)為Aname,節(jié)點(diǎn)值(value)為AValue:
procedure AddNode(ADoc: TXmlDocument; AName, AValue: widestring);
begin
with ADoc.Root do
with NodeNew(FromWidestring(AName)) do
ValueAsWidestring := AValue;
end;
3.5.4.加載XML文件的擴(kuò)展字符
當(dāng)讀取包含擴(kuò)展字符的XML文件,重要的是在引入前設(shè)置Utf8Encoded為True,像這樣:
function CreateXMLAndLoadFromFile(AFilename: string): TNativeXml;
begin
Result := TNativeXml.Create;
Result.Utf8Encoded := True;
Result.LoadFromFile(AFilename);
end;
當(dāng)從一個(gè)流(例如從一個(gè)TCP連接)讀入,流并不總是包含字節(jié)順序標(biāo)記(BOM)。但是,如果流是Unicode,NativeXml將承認(rèn)它,因此沒有任何幫助。例如:
function CreateXMLAndLoadFromStream(S: TStream): TNativeXml;
begin
Result := TNativeXml.Create;
Result.Utf8Encoded := True;
Result.LoadFromStream(S);
end;
如果你知道你的流具有一定的編碼,你可以強(qiáng)制NativeXml使用這種編碼,例如:
function CreateXMLAndLoadFromUTF8Stream(S: TStream): TNativeXml;
begin
Result := TNativeXml.Create;
Result.Utf8Encoded := True;
// The stream is encoded using UTF8
Result.ExternalEncoding := seUTF8;
Result.LoadFromStream(S);
end;
看完上述內(nèi)容,你們掌握Delphi中怎么使用NativeXml處理XML的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。