type OpenXmlPcdata = class public function Create(_node: XmlNode);overload; function Create(_parent: tslobj; _prefix: string; _local_name: string);overload; function Init();virtual; function InitAttributes();virtual; function InitNode(_node: XmlNode);virtual; 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; Text: string; // 元素的文本内容 protected attributes_: array of OpenXmlAttribute; // 属性 end; function OpenXmlPcdata.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 OpenXmlPcdata.Create(_parent: tslobj; _prefix: string; _local_name: string);overload; begin {self.}Parent := _parent; {self.}Prefix := _prefix; {self.}LocalName := _local_name; {self.}XmlNode := nil; {self.}Text := nil; {self.}ElementName := ifString({self.}Prefix) and {self.}Prefix <> "" ? format("%s:%s", {self.}Prefix, {self.}LocalName) : {self.}LocalName; {self.}Init(); {self.}InitAttributes(); end; function OpenXmlPcdata.InitNode(_node: XmlNode);virtual; begin {self.}XmlNode := ifObj(_node) ? _node : nil; end; function OpenXmlPcdata.Marshal(): tableArray; begin arr := array("type": "element", "name": name_, "attributes": array(), "children": array()); for k,v in attributes_ do if not ifnil(v.Value) then arr["attributes"][v.ElementName] := v.Value; if not ifnil({self.}Text) then arr["children"] := array(("type": "pcdata", "value": {self.}Text)); return arr; end; function OpenXmlPcdata.Deserialize(); begin {self.}Text := ifObj({self.}XmlNode) ? {self.}XmlNode.GetText() : nil; for k,v in attributes_ do v.Value := ifObj({self.}XmlNode) ? {self.}XmlNode.GetAttribute(v.ElementName) : nil; end; function OpenXmlPcdata.GetNode(): XmlNode; begin if not ifObj({self.}XmlNode) then {self.}XmlNode := {self.}Parent.GetOrCreateNode(self); return {self.}XmlNode; end; function OpenXmlPcdata.Serialize(); begin if not ifnil({self.}Text) then {self.}GetNode().SetValue({self.}Text); for k,v in attributes_ do if not ifnil(v.Value) then {self.}GetNode().SetAttribute(v.ElementName, v.Value); end;