首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OmniXML中创建简单的XML

如何在OmniXML中创建简单的XML
EN

Stack Overflow用户
提问于 2011-09-01 21:38:27
回答 3查看 2.9K关注 0票数 2

我想要创建这个结构xml。

代码语言:javascript
复制
<root ver="" file=""> 
  <row> 
    <id></id> 
    <name></name> 
    <surname></surname> 
    <time></time> 
    <old></old> 
    <subject></subject> 
  </row> 
</root> 

当我完成主要结构时,我从在线数据库中获取数据,并希望将其添加到xml文件中。

  1. 我如何创建主体结构?
  2. 如何在数据库进行的每次更新中添加一个新行
  3. 如何对名称节点的基xml进行排序?

请帮帮忙

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-02 14:18:58

可以使用create继承类来定义xml。

代码语言:javascript
复制
interface

uses
  OmniXML, OmniXMLProperties;

type
  TRow = class(TGpXMLData)
  public
    constructor Create(Node: IXMLNode); override;

    property Id: integer index 0 read GetXMLPropInt write SetXMLPropInt;
    property Name: WideString index 1 read GetXMLPropWide write SetXMLPropWide;
    property Surname: WideString index 2 read GetXMLPropWide write SetXMLPropWide;
    property Time: WideString index 3 read GetXMLPropWide write SetXMLPropWide;
    property Old: WideString index 4 read GetXMLPropWide write SetXMLPropWide;
    property Subject: WideString index 5 read GetXMLPropWide write SetXMLPropWide;
  end;

  TRows = class(TGpXMLList)
  protected
    function GetRow(Value: integer): TRow;
  public
    constructor Create(ParentNode: IXMLNode); reintroduce;

    function Add: TRow; reintroduce;

    property Rows[Value: integer]: TRow read GetRow; default;
  end;

  TRootsXml = class(TGpXmlDocList)
  private
    fRows: TRows;
  public
    constructor Create; reintroduce;
    destructor Destroy; override;

    property Ver: WideString index 0 read GetXMLAttrPropWide write SetXMLAttrPropWide;
    property RootFile: WideString index 1 read GetXMLAttrPropWide write SetXMLAttrPropWide;

    property Rows: TRows read fRows;
  end;

implementation

constructor TRow.Create(Node: IXMLNode);
begin
  inherited;

  InitChildNodes(['id', 'name', 'surname', 'time', 'old', 'subjects'], 
    ['', '', '', '', '', '']);
end;

constructor TRows.Create(parentNode: IXMLNode);
begin
  inherited Create(parentNode, '', 'row', TRow);
end;

function TRows.Add: TRow;
begin
  result := TRow(inherited Add);
end;

function TRows.GetRow(Value: Integer): TRow;
begin
  Result := TRow(inherited Items[Value]);
end;

constructor TRootsXml.Create;
var
  xmlPI: IXMLProcessingInstruction;
begin
  inherited Create('Root', '', '', nil);

  xmlPI := XMLDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="utf-8"');
  XMLDoc.InsertBefore(xmlPI, node);

  InitChildNodes(['ver', 'file'], ['', '']);

  fRows := TRows.Create(node);
end; 

destructor TRootsXml.Destroy;
begin
  fRows.free;

  inherited;
end;

在此之后,编写一个导出数据的过程。

代码语言:javascript
复制
procedure TExport.Exportrows;
var
  rootsXml: TRootsXml;
  row: TRow;
  i: integer;
begin
  rootsXml := TRootsXml.Create;
  try
    rootsXml.Ver := 'version 27';
    rootsXml.RootFile := 'fred.exe';

    for i := 1 to 10 do
    begin
      row := rootsXml.Rows.Add;

      row.Id := i;
      row.Name := 'fred';  
      row.Surname := 'Flintstone';
      row.Time := 'late';
      row.Old := 'very';
      row.Subject := 'Delphi';
    end;

    rootsXml.SaveToFile('c:\test\test.xml', ofIndent);
  finally
    rootsXml.free;
  end;
end;
票数 4
EN

Stack Overflow用户

发布于 2011-09-02 06:11:11

使用GpFluentXML

代码语言:javascript
复制
var
  root : IXMLNode;
  rowID: integer;
  xml  : IGpFluentXmlBuilder;
begin
  xml := CreateFluentXml
    .AddChild('root')
      ['ver', '']
      ['file', '']
    .Anchor(root);
  for rowID := 1 to 10 do begin
    xml
      .Jump(root)
      .AddChild('row')
        .AddChild('id', rowID)
        .AddSibling('name', '')
        .AddSibling('surname', '')
        .AddSibling('time', '')
        .AddSibling('old', '')
        .AddSibling('subject', '');
  end;
  XMLSaveToFile(xml.Xml, 'filename', ofIndent);
end;

使用OmniXMLUtils ( OmniXML发行版的一部分):

代码语言:javascript
复制
var
  row  : IXMLNode;
  rowID: integer;
  xml  : IXMLDocument;
begin
  xml := ConstructXMLDocument('root');
  SetNodeAttr(xml.DocumentElement, 'ver', '');
  SetNodeAttr(xml.DocumentElement, 'file', '');
  for rowID := 1 to 10 do begin
    row := AppendNode(xml, 'row');
    SetNodeTextInt(row, 'id', rowID);
    SetNodeText(row, 'name', '');
    SetNodeText(row, 'surname', '');
    SetNodeText(row, 'time', '');
    SetNodeText(row, 'old', '');
    SetNodeText(row, 'subject', '');
  end;
  XMLSaveToFile(xml, 'filename', ofIndent);
end;

至于排序,您不对XML进行排序,而是在将数据添加到文档之前对其进行排序。

票数 4
EN

Stack Overflow用户

发布于 2011-09-01 23:45:17

使用标准组件TXMLDocument:(如果找不到其他解决方案,也许可以将TXMLDocument生成的xml复制到OmniXML :/)

代码语言:javascript
复制
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    xmldoc1: TXMLDocument;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  I: Integer;
begin
  xmldoc1.XML.Text := '<root ver="" file=""></root>'; //<row><id></id><name></name><surname></surname><time></time><old></old><subject></subject></row>';
  xmldoc1.Active   := True;

  for I := 0 to 9 do
  begin
    with xmldoc1.ChildNodes['root'].AddChild('row') do
    begin
      AddChild('name').Text    := 'NAME' + IntToStr(I);
      AddChild('surname').Text := 'SURNAME';
      AddChild('time').Text    := TimeToStr(Now);
      AddChild('old').Text     := IntToStr(20);
      AddChild('subject').Text := 'SUBJECT';
    end;
  end;

  ShowMessage(xmldoc1.XML.Text);
end;

end.

对于OmniXML,类似这样的东西应该可以工作:

代码语言:javascript
复制
uses OmniXML;

var
  aChild: IXMLElement;
  aRow  : IXMLElement;
  rowID : Integer;
  XMLDoc: IXMLDocument;
begin
  XMLDoc := CreateXMLDoc;
  XMLDoc.DocumentElement := XMLDoc.CreateElement('root');
  XMLDoc.DocumentElement.SetAttribute('ver', 'value');
  XMLDoc.DocumentElement.SetAttribute('file', 'value');
  for rowID := 1 to 10 do begin
    aRow   := XMLDoc.CreateElement('row');
    XMLDoc.DocumentElement.AppendChild(aRow);
    aChild := XMLDoc.CreateElement('id');
    aChild.Text := IntToStr(rowID);
    aRow.AppendChild(aChild);
    aChild := XMLDoc.CreateElement('name');
    aChild.Text := 'NAME';
    aRow.AppendChild(aChild);
    aChild := XMLDoc.CreateElement('surname');
    aChild.Text := 'SURNAME';
    aRow.AppendChild(aChild);
    //...
  end;

  XMLDoc.Save('filename', ofIndent);
end;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7276880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档