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; // 元素的文本内容,有的话就是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;
|
||
|