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>
 </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;


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:\temp\test.xml');    
    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-

长按下方二维码关注微卡智享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值