OfficeXml/openxml/OpenXmlPcdata.tsf

83 lines
2.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;