|
| 1 | +<h2>Full example</h2> |
| 2 | +<pre><code>/* Source: https://github.com/chrismalek/psoftToXML/blob/master/psftToXML.pcode */ |
| 3 | + |
| 4 | +class psoftToXML |
| 5 | + method RowsetToXML(&parentNode As XmlNode, &rowSetIn As Rowset) Returns XmlNode; |
| 6 | + method RecordToXML(&parentNode As XmlNode, &recordIn As Record) Returns XmlNode; |
| 7 | + method FieldToXML(&ParentNode As XmlNode, &fieldIn As Field) Returns XmlNode; |
| 8 | + method RowToXML(&ParentNode As XmlNode, &rowIn As Row) Returns XmlNode; |
| 9 | + method psoftToXML(); |
| 10 | + property array of string fieldsToSkip; |
| 11 | +private |
| 12 | + instance string &psObjectTypeString; |
| 13 | +end-class; |
| 14 | + |
| 15 | +method psoftToXML |
| 16 | + &psObjectTypeString = "PSOBJECTTYPE"; |
| 17 | + %This.fieldsToSkip = CreateArrayRept("", 0); |
| 18 | +end-method; |
| 19 | + |
| 20 | +method FieldToXML |
| 21 | + /+ &ParentNode as XmlNode, +/ |
| 22 | + /+ &fieldIn as Field +/ |
| 23 | + /+ Returns XmlNode +/ |
| 24 | + Local XmlNode &outNode; |
| 25 | + |
| 26 | + Local XmlNode &fldNode, &tempNode; |
| 27 | + |
| 28 | + &fldNode = &ParentNode.AddElement(&fieldIn.Name); |
| 29 | + |
| 30 | + &fldNode.AddAttribute("PSFIELDTYPE", &fieldIn.Type); |
| 31 | + &fldNode.AddAttribute(%This.psObjectTypeString, "FIELD"); |
| 32 | + |
| 33 | + If &fieldIn.IsEditXlat Then |
| 34 | + &fldNode.AddAttribute("LongTranslateValue", &fieldIn.LongTranslateValue); |
| 35 | + End-If; |
| 36 | + |
| 37 | + Evaluate &fieldIn.Type |
| 38 | + When = "LONGCHAR" |
| 39 | + When = "IMAGE" |
| 40 | + When = "IMAGEREFERENCE" |
| 41 | + If All(&fieldIn.Value) Then |
| 42 | + |
| 43 | + &tempNode = &fldNode.AddCDataSection(&fieldIn.Value); |
| 44 | + End-If; |
| 45 | + Break; |
| 46 | + |
| 47 | + When = "NUMBER"; |
| 48 | + &tempNode = &fldNode.AddText(&fieldIn.Value); |
| 49 | + Break; |
| 50 | + When-Other |
| 51 | + If All(&fieldIn.Value) Then |
| 52 | + &tempNode = &fldNode.AddText(&fieldIn.Value); |
| 53 | + End-If; |
| 54 | + |
| 55 | + Break; |
| 56 | + End-Evaluate; |
| 57 | + |
| 58 | + Return &outNode; |
| 59 | +end-method; |
| 60 | + |
| 61 | + |
| 62 | +method RecordToXML |
| 63 | + /+ &parentNode as XmlNode, +/ |
| 64 | + /+ &recordIn as Record +/ |
| 65 | + /+ Returns XmlNode +/ |
| 66 | + |
| 67 | + Local XmlNode &outNode, &fieldNode; |
| 68 | + |
| 69 | + Local integer &i; |
| 70 | + |
| 71 | + &outNode = &parentNode.AddElement(&recordIn.Name); |
| 72 | + |
| 73 | + &outNode.AddAttribute(%This.psObjectTypeString, "RECORD"); |
| 74 | + |
| 75 | + For &i = 1 To &recordIn.FieldCount |
| 76 | + |
| 77 | + If %This.fieldsToSkip.Find(&recordIn.GetField(&i).Name) <= 0 Then |
| 78 | + &fieldNode = %This.FieldToXML(&outNode, &recordIn.GetField(&i)); |
| 79 | + End-If; |
| 80 | + End-For; |
| 81 | + |
| 82 | + Return &outNode; |
| 83 | +end-method; |
| 84 | + |
| 85 | + |
| 86 | +method RowToXML |
| 87 | + /+ &ParentNode as XmlNode, +/ |
| 88 | + /+ &rowIn as Row +/ |
| 89 | + /+ Returns XmlNode +/ |
| 90 | + |
| 91 | + Local XmlNode &outNode, &recNode; |
| 92 | + |
| 93 | + Local integer &i; |
| 94 | + |
| 95 | + &outNode = &ParentNode.AddElement("ROW"); |
| 96 | + &outNode.AddAttribute(&psObjectTypeString, "ROW"); |
| 97 | + &outNode.AddAttribute("RowNumber", String(&rowIn.RowNumber)); |
| 98 | + |
| 99 | + For &i = 1 To &rowIn.RecordCount |
| 100 | + &recNode = %This.RecordToXML(&outNode, &rowIn.GetRecord(&i)); |
| 101 | + End-For; |
| 102 | + |
| 103 | + Local XmlNode &rsNode; |
| 104 | + For &i = 1 To &rowIn.ChildCount |
| 105 | + &rsNode = %This.RowsetToXML(&outNode, &rowIn.GetRowset(&i)); |
| 106 | + |
| 107 | + End-For; |
| 108 | + |
| 109 | + Return &outNode; |
| 110 | +end-method; |
| 111 | + |
| 112 | + |
| 113 | +method RowsetToXML |
| 114 | + /+ &parentNode as XmlNode, +/ |
| 115 | + /+ &rowSetIn as Rowset +/ |
| 116 | + /+ Returns XmlNode +/ |
| 117 | + |
| 118 | + Local XmlNode &outNode, &rowNode; |
| 119 | + |
| 120 | + Local integer &i; |
| 121 | + &outNode = &parentNode.AddElement(&rowSetIn.DBRecordName); |
| 122 | + &outNode.AddAttribute(&psObjectTypeString, "ROWSET"); |
| 123 | + |
| 124 | + For &i = 1 To &rowSetIn.ActiveRowCount |
| 125 | + &rowNode = %This.RowToXML(&outNode, &rowSetIn.GetRow(&i)); |
| 126 | + End-For; |
| 127 | + Return &outNode; |
| 128 | +end-method;</code></pre> |
0 commit comments