OfficeXml/openxml/OpenXmlEmpty.tsf

108 lines
3.1 KiB
Plaintext

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;