1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137:
| unit XML;
interface uses ComCtrls;
procedure xmlToTree(filename: string; tree: TTreeView); procedure treeToXML(filename: string; tree: TTreeView);
implementation uses Forms, SysUtils, XMLdoc, XMLIntf, Classes, Global, Job;
procedure xmlToTree(filename: string; tree: TTreeView); var iNode : IXMLNode; xmldoc: TXMLDocument; function getAttribute(const node: IXMLNode; const attr: string; const default: string = ''): oleVariant; begin if node.HasAttribute(attr) then result := string(node.Attributes[attr]) else result := default; end; procedure processNode(node: IXMLNode; treeNode: TTreeNode); var childNode : iXMLNode; begin if (node = nil) or (node.NodeName <> 'item') then exit(); if node.HasAttribute('name') then begin writeln(node.attributes['name']); treeNode := tree.Items.AddChild(treeNode, node.Attributes['name']) end else treeNode := tree.Items.AddChild(treeNode, '?! corrupt data'); treeNode.ImageIndex := integer(getAttribute(node, 'image', '0')); treeNode.SelectedIndex := treeNode.ImageIndex;
treeNode.Data := TJob.create(); TJob(treeNode.data).name := treeNode.Text; TJob(treeNode.data).description := string(getAttribute(node, 'description')); TJob(treeNode.data).priority := integer(getAttribute(node, 'priority', '0')); TJob(treeNode.data).done := boolean(getAttribute(node, 'done', 'false')); TJob(treeNode.data).autoDone := boolean(getAttribute(node, 'autodone', 'false'));
childNode := Node.ChildNodes.First; while childNode <> nil do begin ProcessNode(childNode, treeNode); childNode := childNode.NextSibling; end; end; begin if tree = nil then exit(); tree.items.Clear(); xmlDoc := TXmlDocument.Create(application); xmlDoc.FileName := filename; xmlDoc.Active := true; iNode := xmlDoc.DocumentElement.ChildNodes.First;
while iNode <> nil do begin processNode(iNode,nil); iNode := iNode.NextSibling; end; xmlDoc.Active := False; xmlDoc.destroy; end;
procedure treeToXml(filename: string; tree: TTreeView); var treeNode : TTreeNode; XMLDoc : TXMLDocument; iNode : IXMLNode; procedure processTreeItem(treeNode: TTreeNode; iNode: IXMLNode); var aNode: IXMLNode; begin if (treeNode = nil) then Exit; aNode := iNode.AddChild('item'); aNode.Attributes['name'] := treeNode.Text; aNode.Attributes['image'] := treeNode.ImageIndex; aNode.Attributes['priority'] := TJob(treeNode.data).priority; aNode.Attributes['done'] := TJob(treeNode.data).done; aNode.Attributes['autodone'] := TJob(treeNode.data).autoDone; aNode.Attributes['description'] := TJob(treeNode.data).description; treeNode := treeNode.getFirstChild; while treeNode <> nil do begin processTreeItem(treeNode, aNode); treeNode := treeNode.getNextSibling; end; end; begin xmlDoc := TXMLDocument.Create(application); xmlDoc.Active := True; iNode := xmlDoc.AddChild('twodo'); iNode.Attributes['x2d-version'] := Global.X2D_VERSION;
treeNode := tree.TopItem; while treeNode <> nil do begin processTreeItem (treeNode, iNode); treeNode := treeNode.getNextSibling; end;
xmlDoc.saveToFile(filename); xmlDoc.free(); end; end. |