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; // 元素的文本内容,有的话就是pcdata,没有就是普通的节点 protected attributes_: tableArray; // 不提供访问 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;