2011-12-28 50 views
1

我想写一些代码(在Delphi中)来获得这个XML方案,我试过但没有结果,因为我想,你能帮助我! 我使用(或希望使用)在运行时创建IXMLDocument,但我无法理解“节点”,“ChildNodes”......我知道,这太可笑了!如何用Delphi创建这个XML?

这是该计划的例子,我想:

<Items> 
<Task id="eec0-47de-91bc-98e2d69d75cd"> 
    <Title>The title of something</Title> 
    <State>Done</State> 
    <IdNoHashed>This Is a string</IdNoHashed> 
    <CreatedDate>28/12/2011 06:24:57</CreatedDate> 
    <Note>Just a note</Note> 
</Task> 
<Task id="e2x5d4-2d45c-98e2d69d75cd"> 
    <Title>Another title</Title> 
    <State>Done</State> 
    <IdNoHashed>This Is a string 2</IdNoHashed> 
    <CreatedDate>28/12/2011 22:22:22</CreatedDate> 
    <Note>Just a note, again !</Note> 
</Task> 
</items> 

你有一个建议吗? 谢谢!

编辑:我试了下面的代码回答,它工作正常,但是当我想在根中添加任何其他条目时,它会重写已存在的元素。

Function WriteData (id, title, state, idNH : String) : Boolean; 
var 
    Doc: IXMLDocument; 
    Items, Task: IXMLNode; 
begin 
    Doc := NewXMLDocument; 
    Items := Doc.AddChild('Items'); 

    Task := Items.AddChild('Task'); 
    Task.Attributes['id'] := id; 
    Task.AddChild('Title').Text := title; 
    Task.AddChild('State').Text := state; 
    Task.AddChild('IdNoHashed').Text := idNH; 
    Task.AddChild('CreatedDate').Text := DateTimeToStr(Now); 
    Task.AddChild('Note').Text := 'Just a note'; 
end; 

我试过DocumentElement.ChildNodes.FindNode(id),但没有成功!

我创建了一个函数,我每次调用添加/修改XML文件中的条目时,条目都是“”。 一个想法,我该如何做到这一点?! 谢谢!

回答

6

检查哪个使用IXMLDocument接口此示例应用程序,在源的注释解释了元素是如何加入

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    ActiveX, 
    XMLIntf, 
    XMLDoc, 
    SysUtils; 

procedure Test; 
Var 
    XML : IXMLDocument; 
    RootNode, Node, CNode : IXMLNode; 
begin 
    XML := NewXMLDocument;//initializate the interface 
    XML.Options := [doNodeAutoIndent];//activate the auto indentation 
    RootNode := XML.AddChild('Items');//add the root node 
    Node := RootNode.AddChild('Task');//add the task node 
    Node.Attributes['id'] := 'eec0-47de-91bc-98e2d69d75cd';//<Task id="eec0-47de-91bc-98e2d69d75cd"> 
    CNode:=Node.AddChild('Title');//add the title node 
    CNode.Text:='The title of something';//<Title>The title of something</Title> 
    CNode:=Node.AddChild('State');//add the State node 
    CNode.Text:='Done'; //<State>Done</State> 
    CNode:=Node.AddChild('IdNoHashed');//add the IdNoHashed node 
    CNode.Text:='This Is a string'; //<IdNoHashed>This Is a string</IdNoHashed> 
    CNode:=Node.AddChild('CreatedDate');//add the CreatedDate node 
    CNode.Text:=FormatDateTime('dd/mm/yyyy hh:nn:ss',EncodeDate(2011,12,28)+EncodeTime(6,24,57,0));//<CreatedDate>28/12/2011 06:24:57</CreatedDate> 
    CNode:=Node.AddChild('Note');//Add the Note node 
    CNode.Text:='Just a note'; //<Note>Just a note</Note> 

    //repeat the process again for the second task node  
    Node := RootNode.AddChild('Task'); 
    Node.Attributes['id'] := 'e2x5d4-2d45c-98e2d69d75cd'; 
    CNode:=Node.AddChild('Title'); 
    CNode.Text:='Another title'; 
    CNode:=Node.AddChild('State'); 
    CNode.Text:='Done'; 
    CNode:=Node.AddChild('IdNoHashed'); 
    CNode.Text:='This Is a string 2'; 
    CNode:=Node.AddChild('CreatedDate'); 
    CNode.Text:=FormatDateTime('dd/mm/yyyy hh:nn:ss',EncodeDate(2011,12,28)+EncodeTime(22,22,22,0)); 
    CNode:=Node.AddChild('Note'); 
    CNode.Text:='Just a note, again !'; 

    Writeln(XML.XML.Text); //Show the output 
end; 


begin 
try 
    CoInitialize(nil); //use this just in console apps 
    try 
     Test; 
    finally 
     CoUninitialize;//use this just in console apps 
    end; 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+0

非常感谢你,为了准确性,并为评论,我终于明白了事情!谢谢 !! – djiga4me 2011-12-28 17:06:02

5

像这样:

var 
    Doc: IXMLDocument; 
    Items, Task: IXMLNode; 
begin 
    Doc := NewXMLDocument; 
    Items := Doc.AddChild('Items'); 

    Task := Items.AddChild('Task'); 
    Task.Attributes['id'] := 'eec0-47de-91bc-98e2d69d75cd'; 
    Task.AddChild('Title').Text := 'The title of something'; 
    Task.AddChild('State').Text := 'Done'; 
    Task.AddChild('IdNoHashed').Text := 'This Is a string'; 
    Task.AddChild('CreatedDate').Text := DateTimeToStr(Now); 
    Task.AddChild('Note').Text := 'Just a note'; 

    Task := Items.AddChild('Task'); 
    Task.Attributes['id'] := 'e2x5d4-2d45c-98e2d69d75cd'; 
    Task.AddChild('Title').Text := 'Another title'; 
    Task.AddChild('State').Text := 'Done'; 
    Task.AddChild('IdNoHashed').Text := 'This Is a string 2'; 
    Task.AddChild('CreatedDate').Text := DateTimeToStr(Now); 
    Task.AddChild('Note').Text := 'Just a note, again!'; 

// save Doc as needed... 
// Doc.SaveToStream(...); 
// Doc.SaveToFile(...); 
// Doc.SaveToXML(...); 
// XML := Doc.XML.Text; 
// etc... 

端;

+0

谢谢,这很简单,(只需添加为Doc.Options:= [doNodeAutoIndent])缩进事物!我会用这个方便! – djiga4me 2011-12-28 17:08:11