Delphi操作XML

Delphi操作XML

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
= 64.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規範。

====================================================================================
原文:http://www.tuicool.com/articles/aqAbme3
發佈了48 篇原創文章 · 獲贊 15 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章