Delphi使⽤NativeXml处理XML(⼀)前⾔
  本帮助⽂件提供从SimDesign BV的NativeXml组件的信息。
使⽤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', [In  dent(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>
索尼xml文件可以删除吗</Customer>
</Root>
  下⾯是⼀个过程的代码,创建此⽂件,并以易读格式保存到⼀个⽂件名为“C:\l”的⽂件:
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:\l');
finally
ADoc.Free;
end;
end;
3.5.例⼦E:使⽤UTF8和Unicode编码的⽂件(⽀持widestring)
  这个例⼦显⽰了如何创建和加载⽀持widestrings的XML⽂件。
3.5.1.NativeXml内部编码
  NativeXml可以⼯作在两种“模式”:要么所有的内部字符串是普通的ANSI字符串或所有内部字符串是UTF8编码字符串。字符串类型不会改变(它仍然是“string”)。虽然Delphi7有⼀种特殊类型“Utf8String”,但没有使⽤,以保持较低的Delphi版本的兼容性。
  为了确保你的XML⽂档可以使⽤widestrings,创建它,然后直接设置属性“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外部编码
  保存您的⽂档时,为外部⽂件或流选择适当的编码(SaveToStream也需要正确的编码保存)。设置属性“ExternalEncoding”到其中的任何值:
  se8bit:这将返回⼀个纯ASCII⽂件,所有的Unicode/widestring字符值⾼于$FF。这是默认值。
  seUTF16LE:这将返回⼀个Unicode⽂件的字节顺序标记$FF FE。这应该作为⼀个Unicode⽂件的默认。
  seUTF16BE:这将返回⼤字节(big-endian)Unicode⽂件的字节顺序标记$FE FF。
  seUTF8:这将返回⼀个UTF-8编码⽂件的字节顺序标记$FF BB BF。UTF-8在⼤部分字符为西⽅或拉丁语时,是更好的存储⽅式。然⽽,它可以为中⽂或⽇⽂等多种语⾔提供更多的空间。
  这⾥有⼀个关于如何设置外部编码的例⼦:
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:\l');
finally
ADoc.Free;
end;
end;
3.5.3.添加widestrings
  添加widestrings到⽂档很容易。每个节点的值可以设置为widestring,使⽤属性的ValueAsWidestring,并可以在⼀般情况下使⽤FromWidestring函数添加widestrings。
  下⾯的例⼦代码,增加了⼀个新的节点到根,然后设置节点名字(Name)为Aname,节点值(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⽂件的扩展字符
  当读取包含扩展字符的XML⽂件,重要的是在引⼊前设置Utf8Encoded为True,像这样:
function CreateXMLAndLoadFromFile(AFilename: string): TNativeXml;
begin
Result := TNativeXml.Create;
Result.Utf8Encoded := True;
Result.LoadFromFile(AFilename);
end;
  当从⼀个流(例如从⼀个TCP连接)读⼊,流并不总是包含字节顺序标记(BOM)。但是,如果流是Unicode,NativeXml将承认它,因此没有任何帮助。例如:
function CreateXMLAndLoadFromStream(S: TStream): TNativeXml;
begin
Result := TNativeXml.Create;
Result.Utf8Encoded := True;
Result.LoadFromStream(S);
end;
  如果你知道你的流具有⼀定的编码,你可以强制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;
-END-
长按下⽅⼆维码关注微卡智享

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。