type OpenXmlEmpty = class public function Create(_node: XmlNode);overload; function Create(_parent: tslobj; _prefix: string; _local_name: string);overload; function Init(); function InitNode(_node: XmlNode); function Copy(_obj: tslobj);virtual; function GetNode(): XmlNode; function Marshal(): tableArray; function Deserialize(); function Serialize(); public LocalName: string; // 本地名称 [weakref]Parent: tslobj; // 父类 Prefix: string; // 前缀 XmlNode: XmlNode; // XMLNode节点 ElementName: string; Value: any; public XmlAttrVal; property Val read ReadXmlAttrVal write WriteXmlAttrVal; function ReadXmlAttrVal(); function WriteXmlAttrVal(_value: any); end; function OpenXmlEmpty.Create(_node: XmlNode);overload; begin node_name := _node.GetName(); pos := Pos(":", node_name); if pos then {self.}Create(nil, node_name[:pos-1], node_name[pos+1:]); else {self.}Create(nil, nil, node_name); {self.}InitNode(_node); end; function OpenXmlEmpty.Create(_parent: tslobj; _prefix: string; _local_name: string);overload; begin {self.}Parent := _parent; {self.}Prefix := _prefix; {self.}LocalName := _local_name; {self.}XmlNode := nil; {self.}ElementName := ifString({self.}Prefix) and {self.}Prefix <> "" ? format("%s:%s", {self.}Prefix, {self.}LocalName) : {self.}LocalName; {self.}Init(); end; function OpenXmlEmpty.Init(); begin {self.}XmlAttrVal := new OpenXmlAttribute({self.}Prefix, "val", nil); end function OpenXmlEmpty.InitNode(_node: XmlNode); begin {self.}XmlNode := ifObj(_node) ? _node : nil; end; function OpenXmlEmpty.Copy(_obj: tslobj); begin if not ifnil(_obj.Value) then {self.}Value := _obj.Value; if not ifnil(_obj.XmlAttrVal.Value) then {self.}XmlAttrVal.Value := _obj.XmlAttrVal.Value; end; function OpenXmlEmpty.Marshal(): tableArray; begin if not {self.}Value then return array(); attr := array(); if not inil({self.}XmlAttrVal.Value) then attr[{self.}XmlAttrVal.ElementName] := {self.}XmlAttrVal.Value; arr := array("type": "element", "name": name_, "attributes": attr, "children": array()); return arr; end; function OpenXmlEmpty.Deserialize(); begin if ifObj({self.}XmlNode) then begin v := {self.}XmlNode.GetAttribute({self.}XmlAttrVal.ElementName); {self.}Value := v = "0" ? false : true; {self.}XmlAttrVal.Value := v = "" ? nil : v; end else begin {self.}Value := nil; end end; function OpenXmlEmpty.GetNode(): XmlNode; begin if not ifObj({self.}XmlNode) then {self.}XmlNode := {self.}Parent.GetOrCreateNode(self); return {self.}XmlNode; end; function OpenXmlEmpty.Serialize(); begin if not ifObj({self.}XmlNode) and not {self.}Value then return; if ifObj({self.}XmlNode) and not {self.}Value and ifObj({self.}Parent) and ifObj({self.}Parent.XmlNode) then {self.}Parent.XmlNode.DeleteChild({self.}XmlNode); if not ifObj({self.}XmlNode) and {self.}Value then {self.}GetNode(); end; function OpenXmlEmpty.ReadXmlAttrVal(); begin return {self.}XmlAttrVal.Value; end; function OpenXmlEmpty.WriteXmlAttrVal(_value: any); begin {self.}XmlAttrVal.Value := _value; end;