83 lines
2.6 KiB
Plaintext
83 lines
2.6 KiB
Plaintext
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;
|
|
|