2011-09-01 42 views
2

創建簡單的XML我希望當我這樣做的主要結構我從網上數據庫中的數據來創建此結構的XML如何OmniXML

<root ver="" file=""> 
    <row> 
    <id></id> 
    <name></name> 
    <surname></surname> 
    <time></time> 
    <old></old> 
    <subject></subject> 
    </row> 
</root> 

,我想將其添加到我的XML文件

  1. 如何創建主體結構
  2. 我怎麼能在每次更新數據庫進行
  3. 添加一個新行我如何能排序的XML,該名節點的基礎

請幫

謝謝

+1

你問3個問題,你需要一次問一個問題,可能發佈一個鏈接到您遇到麻煩 – ComputerSaysNo

+0

該任務的一部分,以前的問題(S),因爲它們綁在一起? –

+0

對不起多蘭基爾託我這吼聲是簡單的問題(exept那種事),我的東西放在一起,所以如果其他人想這樣的事情有一個完整的小教程如何解決這個... – azrael11

回答

4

您可以使用它創建定義XML

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; 

之後繼承的類寫一個程序將數據導出例如

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; 
+0

Gavin當我嘗試添加「rootsXml.ver」我得到內部錯誤e5912 ...但程序成功地建立...與物業的東西是東西,但我找不到它可以幫助我... – azrael11

3

使用標準組件,TXMLDocument的:(如果你沒有找到其他的解決辦法,也許你可以通過複製產生TXMLDocument的你OmniXML的XML:/)

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,這樣的事情應該工作:

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; 
+0

謝謝我的朋友,我嘗試它,當我回家... – azrael11

+0

死神問「如何添加一個新行每......」所以我用擴大,增加了不止一個迭代的OmniXML例子行。也許你可以爲TXMLDocument例子做同樣的事情? – gabr

+0

@gabr:完成; o) – Whiler

4

使用GpFluentXML

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分配的部分):

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;您在將數據添加到文檔之前對數據進行排序。

+0

感謝我的朋友,我嘗試它,並且效果很棒... – azrael11