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;