Delphi操作XMl,只要使用 NativeXml。我是用的版本是4.02。NativeXML的使用方法比較簡單,但是功能很強大。 XE2的話,要在simdesign.inc后面加上: // Delphi XE2 / 16 {$ifdef VER230} {$define D7UP} {$define D10UP} {$define D15UP} {$endif} 一、使用 1) Copy the NativeXml files from the NativeXml directory into your project folder. Copy additional files in the General directory to your project folder or some appropriate general folder you want. 2) Include the clause "uses NativeXml" in your unit. If you want to use NativeXml in all your projects, you can also add the NativeXml folder to your library path. 最簡單的方法是將General 下的 文件和 nativexml 下的 文件復制到一個目錄下,然后加入到 library路徑,這樣以后用到就不用拷來拷去了。 在(實現)部分 uses NativeXml; //必須的。 以下代碼選自萬一的博客 : uses NativeXml; //! const xmlFile = 'C:\Temp\xml_test_files\basic.xml'; //測試文件 {原樣打開} procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.LoadFromFile(xmlFile); end; {使用 NativeXml 打開} procedure TForm1.Button1Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.Create(nil); xml.LoadFromFile(xmlFile); Memo1.Text := xml.WriteToString; xml.Free; end; {使用縮進} procedure TForm1.Button2Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.Create(nil); xml.LoadFromFile(xmlFile); xml.XmlFormat := xfReadable; //格式枚舉:xfCompact(壓縮)、xfReadable(縮進)、xfPreserve(好像暫未處理) Memo1.Text := xml.WriteToString; xml.Free; end; {指定縮進文本} procedure TForm1.Button3Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.Create(nil); xml.LoadFromFile(xmlFile); xml.IndentString := ' '; //IndentString 屬性的默認值是 #9 xml.XmlFormat := xfReadable; Memo1.Text := xml.WriteToString; xml.Free; end; 二、NativeXML對象的創建 1、 XML:=TNativeXML.Create();//aowner可以為nil,可以是Self(這樣可以隨着宿主的釋放而釋放) 2、xml := TNativeXml.CreateEx(False, //是否建立 Declaration 對象, 如:VersionString//顯示 XML 版本;EncodingString //顯示 XML 編碼 True, //是否建立跟節點 nil //指定屬主 ); 3、{使用 CreateName 建立可直接指定根節點的名稱} xml:=TNativeXml.CreateName('MyRoot'); 4、創那個鍵之后可以{使用 New 方法清空並重新構建} procedure TForm1.Button4Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.Create(nil); xml.LoadFromFile(xmlFile); ShowMessage(xml.WriteToString); xml.New; // XML文件清空了相當於 xml.Clear;。 ShowMessage(xml.WriteToString); xml.Free; end; 5、{使用 ReadFromString 從文本讀入} procedure TForm1.Button5Click(Sender: TObject); const str = '<?xml version="1.0"?><Root><Items><item>1</item><item>2</item></Items></Root>'; var xml: TNativeXml; begin xml := TNativeXml.Create(nil); xml.ReadFromString(str); xml.XmlFormat := xfReadable; Memo1.Text := xml.WriteToString; end; 三、保存XML文件 1、xml.ExternalEncoding := seUTF8; //指定編碼,默認為 UTF8 2、xml.SaveToFile('Name.xml'); //保存 四、XML節點{定義根節點 root:TSdElement} TsdElement = class(TsdContainerNode) private FNameID: integer; protected function GetName: Utf8String; override; function GetValue: Utf8String; override; procedure SetName(const Value: Utf8String); override; procedure SetValue(const Value: Utf8String); override; procedure ParseIntermediateData(P: TsdXmlParser); override; procedure CopyFrom(ANode: TObject); override; public // NodeAdd overrides the default addition in a container node: direct nodes // first, then subelements //function NodeAdd(ANode: TXmlNode): integer; override; function ParseStream(P: TsdXmlParser): TXmlNode; override; procedure WriteStream(S: TStream); override; function ElementType: TsdElementType; override; end; 六、事件(摘自 萬一) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NativeXml{!}; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure XmlEvent(Sender: TObject; ANode: TXmlNode); //TsdXmlNodeEvent 事件 public end; var Form1: TForm1; implementation {$R *.dfm} const xmlFile = 'C:\Temp\xml_test_files\CDATA_section.xml'; //測試文件 {測試 OnNodeNew 事件:開始載入節點時發生} procedure TForm1.Button1Click(Sender: TObject); var xml: TNativeXml; begin Memo1.Clear; xml := TNativeXml.Create(nil); xml.OnNodeNew := XmlEvent; xml.LoadFromFile(xmlFile); xml.Free; end; {測試 OnNodeLoaded 事件:節點載入完成時發生} procedure TForm1.Button2Click(Sender: TObject); var xml: TNativeXml; begin Memo1.Clear; xml := TNativeXml.Create(nil); xml.OnNodeLoaded := XmlEvent; xml.LoadFromFile(xmlFile); xml.Free; end; {將被調用的事件, OnNodeNew 和 OnNodeLoaded 事件的參數格式是一樣的} procedure TForm1.XmlEvent(Sender: TObject; ANode: TXmlNode); var depth: string; begin if ANode.ElementType = xeElement then //xeElement 是 TsdElementType 枚舉的類型之一 begin depth := StringOfChar(#9, ANode.TreeDepth); //TreeDepth 是節點深度 Memo1.Lines.Add(depth + ANode.Name); end; end; end. 繼續研究NativeXML: NativeXml的方法屬性:ANativeXml := TNativeXml.Create(Self);//創建 ANativeXml.XmlFormat := xfReadable; //格式 ANativeXml.EncodingString := 'UTF-8';//編碼 ANativeXml.ExternalEncoding := seUTF8; ANativeXml.LoadFromFile();//從文件夾中導入XML文件 ANativeXml.SaveToFile();//XML文件保存到文件夾 節點的方法屬性: ANativeXml.Root;//XML文件的根節點,注意一切都從根開始 ANativeXml.Root.NodeByName(‘節點名’);//通過節點名獲得節點 NativeXml.Root.Attributes;//節點的屬性對象 NativeXml.Root.ChildContainers;//節點的子節點對象 NativeXml.Root.NodeNew();//增加新的子節點 NativeXml.Root.Name;//節點名 NativeXml.Root.Value;//節點值 七、添加節點 根節點的添加,可以在創建時直接指定根節點: var XmlDoc: TnativeXml; Node:TxmlNode; Begin XmlDoc := TNativeXml.CreateName('Data'); //創建根節點的語法 XmlDoc.XmlFormat := xfReadable; ... ... 添加節點有以下幾種方法: Node:=xmlDoc.Root.NodeNew(‘BasicDataNo’); Node.value:=’1’; XmlDoc.Root.NodeNew(‘name’).value:=’sam’; xmlDoc.Root.WriteString(‘sex’,’male); ____________________________________ 更加完整的,在這里引用一下: uses NativeXml; procedure TForm1.Button1Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; // node := xml.Root.NodeNew('item'); node.Value := '張三'; // with xml.Root.NodeNew('item') do begin Value := '李四'; end; // xml.Root.NodeNew('item').Value := '王五'; Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item>張三</item> <item>李四</item> <item>王五</item> </List> *****************************************} procedure TForm1.Button2Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; xml.Root.WriteString('N1', '張三'); xml.Root.WriteString('N2', '李四'); xml.Root.WriteString('N2', '王五'); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <N1>張三</N1> <N2>王五</N2> </List> *****************************************} procedure TForm1.Button3Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; xml.Root.NodeNew('item').WriteString('name', '張三'); xml.Root.NodeNew('item').WriteString('name', '李四'); xml.Root.NodeNew('item').WriteString('name', '王五'); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item> <name>張三</name> </item> <item> <name>李四</name> </item> <item> <name>王五</name> </item> </List> *****************************************} procedure TForm1.Button4Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; with xml.Root.NodeNew('item') do begin WriteString('name', '張三'); WriteInteger('age', 11); end; with xml.Root.NodeNew('item') do begin WriteString('name', '李四'); WriteInteger('age', 22); //WriteFloat()、WriteDateTime()、WriteHex()、WriteBool()... end; with xml.Root.NodeNew('item') do begin WriteString('name', '王五'); WriteInteger('age', 33); end; Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item> <name>張三</name> <age>11</age> </item> <item> <name>李四</name> <age>22</age> </item> <item> <name>王五</name> <age>33</age> </item> </List> *****************************************} procedure TForm1.Button5Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; with xml.Root.NodeNewAtIndex(0, 'item') do begin WriteString('name', '張三'); WriteInteger('age', 11); end; with xml.Root.NodeNewAtIndex(0, 'item') do begin WriteString('name', '李四'); WriteInteger('age', 22); end; with xml.Root.NodeNewAtIndex(0, 'item') do begin WriteString('name', '王五'); WriteInteger('age', 33); end; Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item> <name>王五</name> <age>33</age> </item> <item> <name>李四</name> <age>22</age> </item> <item> <name>張三</name> <age>11</age> </item> </List> *****************************************} procedure TForm1.Button6Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNew('item'); node.WriteString('name', '張三'); node.WriteInteger('age', 11); xml.Root.NodeAdd(node); xml.NodeNewEx('item', node); //NodeNewEx node.WriteString('name', '李四'); node.WriteInteger('age', 22); xml.Root.NodeAdd(node); node := xml.NodeNew('item'); node.WriteString('name', '王五'); node.WriteInteger('age', 33); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item> <name>張三</name> <age>11</age> </item> <item> <name>李四</name> <age>22</age> </item> <item> <name>王五</name> <age>33</age> </item> </List> *****************************************} procedure TForm1.Button7Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNew('item', [xml.NodeNewText('name', '張三'), xml.NodeNewInt('age', 11)]); xml.Root.NodeAdd(node); node := xml.NodeNew('item', [xml.NodeNewText('name', '李四'), xml.NodeNewInt('age', 22)]); xml.Root.NodeAdd(node); node := xml.NodeNew('item', [xml.NodeNewText('name', '王五'), xml.NodeNewInt('age', 33)]); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} procedure TForm1.Button8Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; xml.Root.NodesAdd([ xml.NodeNew('item', [xml.NodeNewText('name', '張三'), xml.NodeNewInt('age', 11)]), xml.NodeNew('item', [xml.NodeNewText('name', '李四'), xml.NodeNewInt('age', 22)]), xml.NodeNew('item', [xml.NodeNewText('name', '王五'), xml.NodeNewInt('age', 33)]) ]); Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} procedure TForm1.Button9Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNew('A', [xml.NodeNew('B', [xml.NodeNew('C', [xml.NodeNewText('D', 'E')])])]); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <A> <B> <C> <D>E</D> </C> </B> </A> </List> *****************************************} 八、屬性、注釋以及內容的添加 添加屬性: node := xml.Root.NodeNew('item'); node.AttributeAdd('ID', '1'); node.AttributeAdd('age', '11'); node.Value := '張三'; node := xml.NodeNewTextAttr('item', '張三', [xml.AttrText('ID', '1'), xml.AttrInt('age', 11)]); xml.Root.NodeAdd(node); {更詳細代碼} uses NativeXml; procedure TForm1.Button1Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.Root.NodeNew('item'); node.AttributeAdd('ID', '1'); node.AttributeAdd('age', '11'); node.Value := '張三'; with xml.Root.NodeNew('item') do begin AttributeAdd('ID', '2'); AttributeAdd('age', '22'); Value := '李四'; end; with xml.Root.NodeNew('item') do begin AttributeAdd('ID', '3'); AttributeAdd('age', '33'); Value := '王五'; end; Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="1" age="11">張三</item> <item ID="2" age="22">李四</item> <item ID="3" age="33">王五</item> </List> *****************************************} procedure TForm1.Button2Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; attr1,attr2: TsdAttribute; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; attr1 := TsdAttribute.Create(xml); attr1.Name := 'ID'; attr1.Value := '1'; attr2 := TsdAttribute.Create(xml); attr2.Name := 'age'; attr2.ValueAsInteger := 11; node := xml.Root.NodeNew('item'); node.AttributeAdd(attr1); node.AttributeAdd(attr2); node.Value := '張三'; attr1 := TsdAttribute.CreateName(xml, 'ID'); attr1.Value := '2'; attr2 := TsdAttribute.CreateNameValue(xml, 'age', '22'); node := xml.Root.NodeNew('item'); node.AttributesAdd([attr1, attr2]); node.Value := '李四'; node := xml.Root.NodeNew('item'); node.AttributesAdd([TsdAttribute.CreateNameValue(xml, 'ID', '3'), TsdAttribute.CreateNameValue(xml, 'age', '33')]); node.Value := '王五'; Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} procedure TForm1.Button3Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; attr1,attr2: TsdAttribute; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; attr1 := xml.AttrText('ID', '1'); attr2 := xml.AttrInt('age', 11); node := xml.Root.NodeNew('item'); node.AttributesAdd([attr1, attr2]); node.Value := '張三'; node := xml.Root.NodeNew('item'); node.AttributesAdd([xml.AttrText('ID', '2'), xml.AttrInt('age', 22)]); node.Value := '李四'; with xml.Root.NodeNew('item') do begin AttributesAdd([xml.AttrText('ID', '3'), xml.AttrInt('age', 33)]); Value := '王五'; end; Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} procedure TForm1.Button4Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNewTextAttr('item', '張三', [xml.AttrText('ID', '1'), xml.AttrInt('age', 11)]); xml.Root.NodeAdd(node); node := xml.NodeNewTextAttr('item', '李四', [xml.AttrText('ID', '2'), xml.AttrInt('age', 22)]); xml.Root.NodeAdd(node); node := xml.NodeNewTextAttr('item', '王五', [xml.AttrText('ID', '3'), xml.AttrInt('age', 33)]); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} procedure TForm1.Button5Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; xml.Root.NodesAdd([ xml.NodeNewTextAttr('item', '張三', [xml.AttrText('ID', '1'), xml.AttrInt('age', 11)]), xml.NodeNewTextAttr('item', '李四', [xml.AttrText('ID', '2'), xml.AttrInt('age', 22)]), xml.NodeNewTextAttr('item', '王五', [xml.AttrText('ID', '3'), xml.AttrInt('age', 33)]) ]); Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} procedure TForm1.Button6Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNewAttr('item', [xml.AttrText('name', '張三'), xml.AttrInt('age', 11)]); xml.Root.NodeAdd(node); node := xml.NodeNewAttr('item', [xml.AttrText('name', '李四'), xml.AttrInt('age', 22)]); xml.Root.NodeAdd(node); node := xml.NodeNewAttr('item', [xml.AttrText('name', '王五'), xml.AttrInt('age', 33)]); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item name="張三" age="11"/> <item name="李四" age="22"/> <item name="王五" age="33"/> </List> *****************************************} procedure TForm1.Button7Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; xml.Root.NodesAdd([ xml.NodeNewAttr('item', [xml.AttrText('name', '張三'), xml.AttrInt('age', 11)]), xml.NodeNewAttr('item', [xml.AttrText('name', '李四'), xml.AttrInt('age', 22)]), xml.NodeNewAttr('item', [xml.AttrText('name', '王五'), xml.AttrInt('age', 33)]) ]); Memo1.Text := xml.WriteToString; xml.Free; end; {結果同上} 添加注釋: node := xml.NodeNewTextType('注釋名稱', '注釋內容', xeComment); xml.Root.NodeAdd(node); 添加CDATA內容 node.NodeAdd(xml.NodeNewTextType('DataName', 'XXXXXXXXXXXX', xeCData)); {更詳細代碼} uses NativeXml; procedure TForm1.Button1Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNewTextType('注釋名稱', '注釋內容', xeComment); xml.Root.NodeAdd(node); node := xml.NodeNewTextType('item', '張三', xeElement); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List><!--注釋內容--> <item>張三</item> </List> *****************************************} procedure TForm1.Button2Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNewTextType('item', '張三', xeElement, [xml.AttrText('ID', '1'), xml.AttrInt('age', 11)]); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="1" age="11">張三</item> </List> *****************************************} procedure TForm1.Button3Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.NodeNewTextTypeAttr('item', '', xeElement, [xml.AttrText('ID', '1')], [xml.NodeNewText('name', '張三'), xml.NodeNewInt('age', 11)]); xml.Root.NodeAdd(node); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="1"> <name>張三</name> <age>11</age> </item> </List> *****************************************} procedure TForm1.Button4Click(Sender: TObject); var xml: TNativeXml; node: TXmlNode; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; node := xml.Root.NodeNew('Data1'); node.NodeAdd(xml.NodeNewTextType('DataName', 'XXXXXXXXXXXX', xeCData)); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <Data1><![CDATA[XXXXXXXXXXXX]]></Data1> </List> *****************************************} procedure TForm1.Button5Click(Sender: TObject); var xml: TNativeXml; begin xml := TNativeXml.CreateName('List'); xml.XmlFormat := xfReadable; xml.Root.NodeAdd(xml.NodeNewTextType('aaa', 'AAAAAAA', xeElement)); xml.Root.NodeAdd(xml.NodeNewTextType('bbb', 'BBBBBBB', xeAttribute)); xml.Root.NodeAdd(xml.NodeNewTextType('ccc', 'CCCCCCC', xeComment)); xml.Root.NodeAdd(xml.NodeNewTextType('ddd', 'DDDDDDD', xeCData)); xml.Root.NodeAdd(xml.NodeNewTextType('eee', 'EEEEEEE', xeCondSection)); xml.Root.NodeAdd(xml.NodeNewTextType('fff', 'FFFFFFF', xeStylesheet)); xml.Root.NodeAdd(xml.NodeNewTextType('ggg', 'GGGGGGG', xeDocType)); xml.Root.NodeAdd(xml.NodeNewTextType('hhh', 'HHHHHHH', xeDtdElement)); xml.Root.NodeAdd(xml.NodeNewTextType('iii', 'IIIIIII', xeDtdAttList)); xml.Root.NodeAdd(xml.NodeNewTextType('jjj', 'JJJJJJJ', xeDtdEntity)); xml.Root.NodeAdd(xml.NodeNewTextType('kkk', 'KKKKKKK', xeDtdNotation)); xml.Root.NodeAdd(xml.NodeNewTextType('lll', 'LLLLLLL', xeInstruction)); xml.Root.NodeAdd(xml.NodeNewTextType('mmm', 'MMMMMMM', xeCharData)); xml.Root.NodeAdd(xml.NodeNewTextType('nnn', 'NNNNNNN', xeWhiteSpace)); xml.Root.NodeAdd(xml.NodeNewTextType('ooo', 'OOOOOOO', xeQuotedText)); Memo1.Text := xml.WriteToString; xml.Free; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List bbb="BBBBBBB"NNNNNNN> <aaa>AAAAAAA</aaa> <!--CCCCCCC--> <![CDATA[DDDDDDD]]> <!--EEEEEEE--> <?xml-stylesheetFFFFFFF?> [ GGGGGGG]> <!ELEMENT hhh HHHHHHH> <!ATTLIST iii IIIIIII> <!ENTITY jjj JJJJJJJ> <!NOTATION kkk KKKKKKK> <?LLLLLLL?> MMMMMMM "OOOOOOO" </List> *****************************************} 九、NativeXml 讀取 NativeXml打開xml文本 Var Xml:TnativeXml; Begin Xml:=TnativeXml.Create(nil); Xml.loadformFile(‘xml_file_path’); End; 讀取declaration declaration: TsdDeclaration; declaration := xml.RootNodes[0] as TsdDeclaration; ShowMessageFmt('%s, %s', [declaration.Version, declaration.Encoding]); //1.0, UTF-8 節點信息以及讀取 xml.RootNodes[1]代表根節點,與xml.Root相同 xml.Root.Name:根節點名稱 xml.Root.NodeCount:根節點子節點的總數 xml.Root.WriteToString讀取根節點下的所有內容 xml.Root[0]:第一個子節點 var xml: TNativeXml; const xmlStr = '<?xml version="1.0" encoding="UTF-8"?>' + '<List>' + '<item ID="No.1" age="11">寮犱笁</item>' + '<item ID="No.2" age="22">鏉庡洓</item>' + '<item ID="No.3" age="33">鐜嬩簲</item>' + '</List>'; procedure TForm1.FormCreate(Sender: TObject); begin xml := TNativeXml.Create(Self); xml.XmlFormat := xfReadable; xml.ReadFromString(xmlStr); {!} Memo1.Text := xml.WriteToString; end; {RootNodes} procedure TForm1.Button1Click(Sender: TObject); var declaration: TsdDeclaration; root: TXmlNode; begin ShowMessageFmt('%s, %s', [xml.VersionString, xml.EncodingString]); //1.0, UTF-8 declaration := xml.RootNodes[0] as TsdDeclaration; ShowMessageFmt('%s, %s', [declaration.Version, declaration.Encoding]); //1.0, UTF-8 ShowMessageFmt('%s, %d', [xml.Root.Name, xml.Root.NodeCount]); //List, 3 root := xml.RootNodes[1]; ShowMessageFmt('%s, %d', [root.Name, root.NodeCount]); //List, 3 end; procedure TForm1.Button2Click(Sender: TObject); var node: TXmlNode; begin node := xml.Root; ShowMessage(node.WriteToString); end; {*************************************** <List> <item ID="No.1" age="11">寮犱笁</item> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} procedure TForm1.Button3Click(Sender: TObject); var node: TXmlNode; begin node := xml.Root[0]; ShowMessage(node.WriteToString); end; {*************************************** <item ID="No.1" age="11">寮犱笁</item> *****************************************} procedure TForm1.Button4Click(Sender: TObject); var node: TXmlNode; begin node := xml.Root[0]; ShowMessage(node.Name); //Item ShowMessage(node.Value); //寮犱笁 ShowMessage(node.Attributes[0].Name); //ID ShowMessage(node.Attributes[0].Value); //No.1 ShowMessage(node.Attributes[0].WriteToString); //ID="No.1" end; procedure TForm1.Button5Click(Sender: TObject); var node: TXmlNode; begin node := xml.Root[0]; ShowMessage(node.AttributeByName['ID'].Value); //No.1 ShowMessage(node.AttributeValueByName['ID']); //No.1 end; procedure TForm1.Button6Click(Sender: TObject); var nodeList: TsdNodeList; node: TXmlNode; i: Integer; begin node := xml.Root; ShowMessage(node.ReadString('item')); //寮犱笁 ShowMessage(node.FindNode('item').Value); //寮犱笁 ShowMessage(node.NodeByName('item').Value); //寮犱笁 //node.NodesByName(); 鐢ㄦ硶鍚? FindNodes nodeList := TsdNodeList.Create(False); node.FindNodes('item', nodeList); for i := 0 to nodeList.Count - 1 do begin ShowMessage(nodeList[i].Value); //寮犱笁/鏉庡洓/鐜嬩簲 end; nodeList.Free; // for i := 0 to node.NodeCount - 1 do begin ShowMessage(node[i].Value); //寮犱笁/鏉庡洓/鐜嬩簲 end; end; procedure TForm1.Button7Click(Sender: TObject); var node: TXmlNode; begin node := xml.Root[0]; ShowMessage(node.Parent.Name); //List ShowMessage(node.Document.EncodingString); //UTF-8 end; {StringTable} procedure TForm1.Button8Click(Sender: TObject); const path = 'c:\temp\test.txt'; begin xml.StringTable.SaveToFile(path); Memo1.Lines.LoadFromFile(path, TEncoding.UTF8); end; {*************************************** 關於NativeXML的編輯操作: uses NativeXml; var xml: TNativeXml; const xmlStr = '<?xml version="1.0" encoding="UTF-8"?>' + '<List>' + '<item ID="No.1" age="11">寮犱笁</item>' + '<item ID="No.2" age="22">鏉庡洓</item>' + '<item ID="No.3" age="33">鐜嬩簲</item>' + '</List>'; procedure TForm1.FormCreate(Sender: TObject); begin xml := TNativeXml.Create(Self); xml.XmlFormat := xfReadable; xml.ReadFromString(xmlStr); {!} Memo1.Text := xml.WriteToString; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.1" age="11">寮犱笁</item> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} {鎻掑叆銆佸垹闄 procedure TForm1.Button2Click(Sender: TObject); begin xml.ReadFromString(xmlStr); xml.Root.NodeInsert(1, xml.NodeNewText('item', '璧靛叚')); xml.Root.NodeDelete(xml.Root.NodeCount - 1); Memo1.Text := xml.WriteToString; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.1" age="11">寮犱笁</item> <item>璧靛叚</item> <item ID="No.2" age="22">鏉庡洓</item> </List> *****************************************} {縐婚櫎} procedure TForm1.Button3Click(Sender: TObject); begin xml.ReadFromString(xmlStr); xml.Root.NodeRemove(xml.Root[0]); Memo1.Text := xml.WriteToString; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} {浜ゆ崲} procedure TForm1.Button4Click(Sender: TObject); begin xml.ReadFromString(xmlStr); xml.Root.NodeExchange(0, 1); Memo1.Text := xml.WriteToString; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.1" age="11">寮犱笁</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} {鎻愬彇} procedure TForm1.Button5Click(Sender: TObject); var node: TXmlNode; begin xml.ReadFromString(xmlStr); node := xml.Root.NodeExtract(xml.Root[1]); Memo1.Text := node.WriteToString; Memo1.Lines.Add('---------------------------------------'); Memo1.Lines.Add(xml.WriteToString); end; {*************************************** <item ID="No.2" age="22">鏉庡洓</item> --------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.1" age="11">寮犱笁</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} {鑾峰彇浣嶇疆} procedure TForm1.Button6Click(Sender: TObject); var n1,n2: Integer; begin xml.ReadFromString(xmlStr); n1 := xml.Root.NodeIndexOf(xml.Root[xml.Root.NodeCount-1]); ShowMessage(IntToStr(n1)); //2 n2 := xml.Root.NodeIndexOf(xml.Root[xml.Root.NodeCount]); ShowMessage(IntToStr(n2)); //-1 end; procedure TForm1.Button7Click(Sender: TObject); var node: TXmlNode; begin xml.ReadFromString(xmlStr); node := xml.Root.NodeFindOrCreate('item'); ShowMessage(node.WriteToString); //<item ID="No.1" age="11">寮犱笁</item> node := xml.Root.NodeFindOrCreate('寮犱笁'); ShowMessage(node.WriteToString); //<寮犱笁/> Memo1.Text := xml.WriteToString; end; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.1" age="11">寮犱笁</item> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.3" age="33">鐜嬩簲</item> <寮犱笁/> </List> *****************************************} procedure TForm1.Button8Click(Sender: TObject); var node: TXmlNode; begin xml.ReadFromString(xmlStr); node := xml.Root[0]; node.Clear; Memo1.Text := xml.WriteToString; {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item/> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} xml.Root.DeleteEmptyNodes; Memo1.Lines.Add('---------------------------------------'); Memo1.Lines.Add(xml.WriteToString); {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List> <item ID="No.2" age="22">鏉庡洓</item> <item ID="No.3" age="33">鐜嬩簲</item> </List> *****************************************} xml.Root.Clear; Memo1.Lines.Add('---------------------------------------'); Memo1.Lines.Add(xml.WriteToString); {*************************************** <?xml version="1.0" encoding="UTF-8"?> <List/> *****************************************} xml.Clear; Memo1.Lines.Add('---------------------------------------'); Memo1.Lines.Add(xml.WriteToString); {*************************************** *****************************************} end; xml.FloatSignificantDigits := 7; 這用來控制浮點類型的小數位數,經測試,發現: value:=123.123456789(共13個數字,不含點) 如果 xml.FloatSignificantDigits:=1,則為100;為2,則為120,為3則為123,為4,則為123.1.....為7,則為123.1234..... 是不是有點怪異?呵呵 以下引自萬一: 安裝包中的 NativeXmlObjectStorage.pas 是 NativeXml 的擴展應用,可以把組件、對象和窗體序列化為 Xml 文件。 其中方便使用的是兩個類:TsdXmlObjectWriter、TsdXmlObjectReader,也可使用下面三組函數: ComponentCreateFromXmlFile(); ComponentCreateFromXmlNode(); ComponentCreateFromXmlStream(); ComponentCreateFromXmlString(); ComponentSaveToXmlFile(); ComponentSaveToXmlNode(); ComponentSaveToXmlStream(); ComponentSaveToXmlString(); ObjectLoadFromXmlFile(); ObjectLoadFromXmlNode(); ObjectLoadFromXmlStream(); ObjectLoadFromXmlString(); ObjectSaveToXmlFile(); ObjectSaveToXmlNode(); ObjectSaveToXmlStream(); ObjectSaveToXmlString(); FormCreateFromXmlFile(); FormCreateFromXmlStream(); FormCreateFromXmlString(); FormSaveToXmlFile(); FormSaveToXmlStream(); FormSaveToXmlString(); 使用NativeXml的例子 3.1.例子A:XML的裝載、存儲和導出 這個例子顯示如何加載一個XML文檔,然后以可讀格式導出到一個TMemo領域。 拖放一個TEdit(Edit1),TButton(Button1)和一個TMemo到你的窗體,然后連接到下面的按鈕的OnClick事件代碼。填寫文件名到Edit1,然后按一下按鈕,您會看到在memo控件中列出XML文件的內容。 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將確保該文件是以易讀的形式列出(以回車符和縮進)。 3.2.例子B:連接到節點 這個例子顯示了如何訪問在XML文件中的各個節點。一個節點可以從一個普通的XML標記、注釋、CDATA結構,等等東西。該示例演示如何使用一個簡單的雙循環列出前2層的節點。 添加Tedit、TButton和TMemo到窗體,然后將下面的事件代碼連接到按鈕的OnClick。然后在Edit1中填寫文件名,按一下按鈕,前兩層的節點將會在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:事件驅動處理 這個例子說明了NativeXml可以用一個SAX-like的方式,按順序讀文件,每當一個節點初始化和加載時產生事件。 添加一個TButton(Button3)和一個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',[Indent(Node.TreeDepth), Node.Name, Node.ValueAsString])); end; 當一個節點被找到,OnNodeNew事件被觸發,每當一個節點完全裝載,OnNodeLoaded事件被觸發。 如果您不希望保留在內存中的XML文件的完整副本,例如,對大型XML文件,你可以直接刪除該節點,釋放其內存。在這種情況下,添加以下代碼到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:創建一個簡單的XML文件 這個例子演示如何創建一個簡單的XML文件,在根節點下的一個節點,有一個屬性和子節點。我們將嘗試創建這個XML文件: <?xml version="1.0" encoding="windows-1252"?> <Root> <Customer ID="123456"> <Name>John Doe</Name> </Customer> </Root> 下面是一個過程的代碼,創建此文件,並以易讀格式保存到一個文件名為“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; 符號引用(Symbol Reference) 4.1.類(Classes) 4.1.1.TComponentAccess類 TComponentAccess = class(TComponent) 4.1.1.1.ComponentState property ComponentState; 4.1.1.2.SetComponentState procedure SetComponentState(const AState: TComponentState); 4.1.2.TNativeXml類 TNativeXml = class(TPersistent) TNativeXml是XML文件的載體。創建一個TNativeXml,然后使用方法LoadFromFile、LoadFromStream或ReadFromString加載XML文檔到內存中。或者從頭開始使用Root.NodeNew添加節點,並最終SaveToFile和SaveToStream保存結果為一個XML文檔。用屬性Xmlformat = xfReadable確保縮進(易讀)輸出。 4.1.2.1.AbortParsing property AbortParsing: boolean; 如果您使用一個SAX-like方式的OnNodeNew和OnNodeLoaded事件,並要中止解析過程,設置AbortParsing為True。例如: procedure MyForm.NativeXmlNodeLoaded(Sender: TObject; Node: TXmlNode); begin if (Node.Name = 'LastNode') and (Sender is TNativeXml) then TNativeXml(Sender).AbortParsing := True; end; 4.1.2.2.BinaryEncoding property BinaryEncoding: TBinaryEncodingType; 當調用TXmlNode.BufferRead和TXmlNode.BufferWrite時,將使用什么樣的二進制編碼。默認值是xbeBase64。 4.1.2.3.CommentString property CommentString: UTF8String; 可以通過此屬性訪問上方的根元素<!--{comment} - >的一個注釋字符串。關聯此說明(comment)屬性,將它添加到XML文檔。使用屬性RootNodeList添加/插入/提取多條說明。 4.1.2.4.DropCommentsOnParse property DropCommentsOnParse: boolean; 設置DropCommentsOnParse,如果你對在你的對象模型數據中任何的說明節點不感興趣,解析過程中遇到的所有的說明將被跳過,而不增加這個節點,ElementType = xeComment(這是默認值)。請注意當您設定這個選項,以后你不能在原來的位置重建一個XML文件的說明。 4.1.2.5.EncodingString property EncodingString: UTF8String; 編碼字符串(例如“的UTF-8”或“的UTF-16”)。這種編碼的字符串存儲在頭部。 例子 1 為了得到這個頭: <?xml version="1.0" encoding="UTF-16" ?> 輸入以下代碼: MyXmlDocument.EncodingString := 'UTF-16'; 當讀取一個文件,EncodingString將包含編碼。 4.1.2.6.EntityByName property EntityByName [AName: UTF8String]: UTF8String; 返回指定名稱命名實體的值。這些實體值從被分析的Doctype聲明中獲得(如果有的話)。 4.1.2.7.ExternalEncoding property ExternalEncoding: TStringEncodingType; ExternalEncoding定義XML文件的保存格式。設置ExternalEncoding到se8bit保存為純文本文件,以seUtf8保存為UTF8的文件(以字節順序標記#EF BB FF),以seUTF16LE保存為Unicode(字節順序標記#FF FE)。當讀取一個XML文件時,ExternalEncoding值將被設置按字節順序標記和/或找到的編碼聲明。 4.1.2.8.FloatAllowScientific property FloatAllowScientific: boolean; 當浮點值轉換成字符串(如在WriteFloat),NativeXml將允許在某些情況下輸出科學記數法,只有在FloatAllowScientific值為True(默認)時,返回結果縮短。 4.1.2.9.FloatSignificantDigits property FloatSignificantDigits: integer; 當浮點值轉換成字符串(如在WriteFloat),NativeXml將利用這屬性表示有效位數。默認值是cDefaultFloatSignificantDigits = 6。 4.1.2.10.IndentString property IndentString: UTF8String; IndentString是縮進使用的字符串。默認情況下,它是兩個空格:' '。如果你需要其他格式,可以設置IndentString為其他的東西,或將其設置為空字符串,以避免縮進。 4.1.2.11.OnNodeCompare property OnNodeCompare: TXmlNodeCompareEvent; 此事件被一個節點的SortChildNodes方法被調用,並沒有直接比較的方法提供。如果你要使用對象事件的節點為基礎的比較方法,實現此事件。 4.1.2.12.OnNodeLoaded property OnNodeLoaded: TXmlNodeEvent; 解析器解析節點已完成時調用此事件,並在內存中創建的完整內容。 4.1.2.13.OnNodeNew property OnNodeNew: TXmlNodeEvent; 當解析器遇到一個新的節點此事件被調用。 4.1.2.14.OnProgress property OnProgress: TXmlProgressEvent; 加載和保存XML文檔期間調用OnProgress。Size參數包含流中的位置。此事件可以被用來實現在裝載和保存的進度指示器。該事件在每一個被讀出或寫入節點后調用。 4.1.2.15.OnUnicodeLoss property OnUnicodeLoss: TNotifyEvent; 從Unicode流或文件讀取時,如果有一個Unicode轉換丟失警告,調用此事件。 4.1.2.16.ParserWarnings property ParserWarnings: boolean; 默認情況下ParserWarnings為True。如果為True,XML文檔不正確時,解析器將拋出一個例外。如果為False,解析器將試圖忽略非關鍵的警告,如基於XML的某些文件SOAP類型消息。 4.1.2.17.Root property Root: TXmlNode; 根(Root)是在XML文件最上面的元素。通過根閱讀任何子元素。當創建一個新的XML文檔,您可以通過CreateName創建並自動包含根節點。 4.1.2.18.RootNodeList property RootNodeList: TXmlNode; RootNodeList可用於直接訪問XML文檔的根的節點列表。通常,這個列表是由一個聲明節點跟着一個標准的根節點。你可以使用這個屬性來添加或刪除注釋(comments),樣式(stylesheets),DTD的等 4.1.2.19.StyleSheetNode property StyleSheetNode: TXmlNode; 從此XML文件獲取樣式節點使用。如果節點尚不存在,它將被創建(因此,如果你使用這個屬性,並且不設置任何屬性,一個空的樣式節點將產生)。 4.1.2.20.UseFullNodes property UseFullNodes: boolean; 保存XML文檔之前,設置UseFullNodes為True,以確保所有節點是由<Node> ...</Node>為代表,而不是短版<Node/>。UseFullNodes默認為False。 4.1.2.21.UseLocalBias property UseLocalBias: Boolean; 如果你在讀寫datetime值時,要考慮當地時差,將UseLocalBias設置為True。UseLocalBias是默認為False。 4.1.2.22.Utf8Encoded property Utf8Encoded: boolean; 此屬性是為向后兼容的:NativeXml所有字符串都是UTF8Strings,內部編碼始終是UTF8的編碼。 4.1.2.23.VersionString property VersionString: UTF8String; 讀完文檔后,這個屬性包含XML版本(通常是“1.0”)。 4.1.2.24.WriteOnDefault property WriteOnDefault: boolean; 如果你不想寫默認值到XML文檔,設置WriteOnDefault為False。此選項可避免產生巨大的冗余信息的文件,並會加快寫入。 4.1.2.25.XmlFormat property XmlFormat: TXmlFormatType; 默認情況下XmlFormat設置為xfCompact。此設置是符合該規范,並NativeXml只會在XML文件中產生#$0A這個Ansi符號。通過設置XmlFormat到xfReadable,你可以方便地生成易讀的XML文件,其中包含每個元素縮進和回車。 4.1.2.26.Assign procedure Assign(Source: TPersistent); override; 當關聯到一個TnativeXml的源對象,將會從源對象復制它的所有數據。 4.1.2.27.Clear procedure Clear; virtual; 調用Clear從對象中刪除所有數據,並恢復所有默認值。 4.1.2.28.Create constructor Create; virtual; 創建一個新的NativeXml文檔,可以用來讀取或寫入XML文件。一個文檔被創建,必須在后期使用Free釋放。 例子 1 var ADoc: TNativeXml; begin ADoc := TNativeXml.Create; try ADoc.LoadFromFile('c:\temp\myxml.xml'); {do something with the document here} finally ADoc.Free; end; end; 4.1.2.29.CreateName constructor CreateName(const ARootName: UTF8String); virtual; 使用CreateName創建一個新的XML文件,將自動包含一個名為ARootName根元素。 4.1.2.30.Destroy destructor Destroy; override; Destroy將釋放在TNativeXml對象中的所有數據。包括根節點下的所有子節點。不要調用Destroy,直接的調用Free代替。 4.1.2.31.IsEmpty function IsEmpty: boolean; virtual; 如果根是被清除的,換句話說,根本不包含任何價值,沒有名字,沒有子節點,並沒有屬性,函數IsEmpty返回True。 4.1.2.32.LoadFromFile procedure LoadFromFile(const AFileName: string); virtual; 調用LoadFromFile過程加載一個指定文件的名XML文件。請參閱Create的例子。當它遇到不正確的XML時,該LoadFromFile過程將引發EFilerError異常。 4.1.2.33.LoadFromStream procedure LoadFromStream(Stream: TStream); virtual; 從流對象TStream加載XML文檔。當它遇到不正確的XML,該LoadFromStream過程將引發EFilerError異常。該方法可用於任何TStream的繼承類。另見LoadFromFile和ReadFromString。 4.1.2.34.ReadFromString procedure ReadFromString(const AValue: UTF8String); virtual; 調用ReadFromString過程從UTF8String類型的Avalue裝載XML文檔。當它遇到不正確的XML,該ReadFromString過程將引發EFilerError異常。 4.1.2.35.ResolveEntityReferences procedure ResolveEntityReferences; 當文檔裝載之后,調用ResolveEntityReferences,以解決任何當前實體引用(&Entity;)。當在DTD中找到一個實體,它將取代實體引用。當一個實體包含XML標記,它會被解析,並成為文檔樹的一部分。由於調用ResolveEntityReferences增加了一些額外的開銷,這不是自動完成的。如果你想要做的實體更換,一個很好的時機是LoadFromFile之后調用ResolveEntityReferences。 4.1.2.36.SaveToFile procedure SaveToFile(const AFileName: string); virtual; 調用SaveToFile保存XML文檔到一個指定文件名的文件。如果文件存在,它將不經警告覆蓋。如果該文件不能被創建,就會產生一個標准I/O異常。如果你希望文件包含XML的縮進,設置XmlFormat到xfReadable,使更多的人易讀。這不是默認的,也沒有使用XML規范。 在保存之前,可以通過設置下面兩個屬性,保存為特殊的編碼類型: ExternalEncoding EncodingString ExternalEncoding可se8bit(純ASCII碼),seUtf8(UTF-8),seUtf16LE(Unicode)或seUtf16BE(大編碼的Unicode)。 不要忘記,還要設置EncodingString(如“UTF-8”或“UTF-16”)這與你的ExternalEncoding匹配。 4.1.2.37.SaveToStream procedure SaveToStream(Stream: TStream); virtual; 調用SaveToStream保存XML文檔到流。流可以是任何TStream的后裔。如果你想流包含XML的縮進,使更多的人易讀,設置XmlFormat到xfReadable。這不是默認的,也沒有使用XML規范。請參閱SaveToFile中有關如何保存特殊的編碼信息。 4.1.2.38.WriteToString function WriteToString: UTF8String; virtual; 調用WriteToString以保存XML文檔到UTF8String。如果您希望UTF8String包含XML的縮進,使更多的人易讀,設置XmlFormat到xfReadable。這不是默認的,也沒有使用XML規范。