v2.0.0
This commit is contained in:
@@ -10,7 +10,6 @@ public
|
||||
Prefix: string;
|
||||
ElementName: string;
|
||||
Value: any;
|
||||
|
||||
end;
|
||||
|
||||
function OpenXmlAttribute.Create(_prefix: string; _local_name: string);overload;
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
type OpenXmlCompositeElement = class(OpenXmlElement)
|
||||
public
|
||||
function InitNode(_node: XmlNode);override;
|
||||
function Deserialize();override;
|
||||
function Serialize();override;
|
||||
function Marshal(): tableArray;override;
|
||||
|
||||
public
|
||||
function AppendChild(_element: OpenXmlElement);
|
||||
function InsertAfter(_element: OpenXmlElement; _pos_element: OpenXmlElement);
|
||||
function RemoveChild(_element: OpenXmlElement);
|
||||
function RemoveAttribute(_attr: OpenXmlAttribute);
|
||||
// function InsertBefore(_pos_obj: tslobj; _obj: tslobj);
|
||||
// function PrependChild(_obj: tslobj);
|
||||
// function SetAttribute(_obj: OpenXmlAttribute);
|
||||
// function RemoveAttribute();
|
||||
|
||||
public
|
||||
function GetOrCreateNode(_obj: tslobj);
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.InitNode(_node: XmlNode);override;
|
||||
begin
|
||||
{self.}XmlNode := _node;
|
||||
if not _node then return;
|
||||
tslassigning_backup := tslassigning;
|
||||
tslassigning := 1;
|
||||
node := _node.FirstChild();
|
||||
while ifObj(node) do
|
||||
begin
|
||||
node_name := node.GetName();
|
||||
arr := sorted_child_[node_name];
|
||||
if ifarray(arr) then
|
||||
begin
|
||||
pf := arr[1];
|
||||
obj := pf.Do();
|
||||
obj.InitNode(node);
|
||||
end
|
||||
node := node.NextElement();
|
||||
end
|
||||
tslassigning := tslassigning_backup;
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.Deserialize();override;
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then return;
|
||||
attrs := {self.}XmlNode.Attributes();
|
||||
for k, v in attrs do
|
||||
begin
|
||||
pos := pos("xmlns", k);
|
||||
if pos then
|
||||
begin
|
||||
xmlns_[k] := k = "xmlns" ? new OpenXmlAttribute("", "xmlns", v) : new OpenXmlattribute("xmlns", k[pos+6:], v);
|
||||
continue;
|
||||
end
|
||||
pf := attributes_pf_[k];
|
||||
if ifnil(pf) then continue;
|
||||
pf.Do(v);
|
||||
end
|
||||
child_elements := container_.GetElements();
|
||||
for k, v in child_elements do
|
||||
v.Deserialize();
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.Serialize();override;
|
||||
begin
|
||||
if {self.}DeleteSelf() then return;
|
||||
|
||||
// xmlns
|
||||
for k, v in xmlns_ do
|
||||
{self.}GetNode().SetAttribute(v.ElementName, v.Value);
|
||||
|
||||
// Attributes
|
||||
for k, v in attributes_ do
|
||||
if not ifnil(v.Value) then
|
||||
{self.}GetNode().SetAttribute(v.ElementName, v.Value);
|
||||
else if {self.}XmlNode then
|
||||
{self.}XmlNode.DeleteAttribute(v.ElementName);
|
||||
|
||||
// Children
|
||||
child_elements := container_.GetElements();
|
||||
for k, v in child_elements do
|
||||
v.Serialize();
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.Marshal(): tableArray;override;
|
||||
begin
|
||||
child_elements := container_.GetElements(false);
|
||||
child_arr := array();
|
||||
for k, v in child_elements do
|
||||
begin
|
||||
arr := array("type": "element", "name": v.ElementName, "attributes": array());
|
||||
if v is Class(OpenXmlTextElement) or v is Class(OpenXmlCompositeElement) then
|
||||
begin
|
||||
marshal := v.Marshal();
|
||||
if length(marshal["children"]) = 0 and length(marshal["attributes"]) = 0 then continue;
|
||||
arr["children"] := marshal["children"];
|
||||
arr["attributes"] union= marshal["attributes"];
|
||||
child_arr[length(child_arr)] := arr;
|
||||
end
|
||||
else if v is Class(OpenXmlSimpleType) then
|
||||
begin
|
||||
marshal := v.Marshal();
|
||||
if length(marshal) > 0 then child_arr[length(child_arr)] := arr;
|
||||
end
|
||||
else begin
|
||||
echo "error = marshal.\n";
|
||||
end
|
||||
end
|
||||
|
||||
tmp_arr := array("type": "element", "name": {self.}ElementName, "children": child_arr, "attributes": array());
|
||||
for k,v in attributes_ do
|
||||
begin
|
||||
if not ifnil(v.Value) then tmp_arr["attributes"][v.ElementName] := v.Value;
|
||||
end
|
||||
return tmp_arr;
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.GetOrCreateNode(_obj: tslobj);
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then {self.}XmlNode := {self.}Parent.GetOrCreateNode(self);
|
||||
nearest_node := nil;
|
||||
child_elements := container_.GetElements(false);
|
||||
for k, v in child_elements do
|
||||
begin
|
||||
if ifObj(v.XmlNode) then nearest_node := v.XmlNode;
|
||||
if v = _obj then
|
||||
begin
|
||||
if ifObj(v.XmlNode) then
|
||||
return v.XmlNode;
|
||||
if ifnil(nearest_node) then
|
||||
return {self.}XmlNode.InsertFirstChild("element", _obj.ElementName);
|
||||
else
|
||||
return {self.}XmlNode.InsertAfterChild(nearest_node, "element", _obj.ElementName);
|
||||
end
|
||||
end
|
||||
raise "No child.";
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.AppendChild(_element: OpenXmlElement);
|
||||
begin
|
||||
container_.Append(_element);
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.InsertAfter(_element: OpenXmlElement; _pos_element: OpenXmlElement);
|
||||
begin
|
||||
container_.InsertAfter(_element, _pos_element);
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.RemoveChild(_element: OpenXmlElement);
|
||||
begin
|
||||
_element.Removed := true;
|
||||
end;
|
||||
|
||||
function OpenXmlCompositeElement.RemoveAttribute(_attr: OpenXmlAttribute);
|
||||
begin
|
||||
_attr.Value := nil;
|
||||
end;
|
||||
|
||||
+34
-128
@@ -5,23 +5,18 @@ public
|
||||
function Init();virtual;
|
||||
function InitNode(_node: XmlNode);virtual;
|
||||
function Copy(_obj: tslobj);virtual;
|
||||
function Deserialize();virtual;
|
||||
function Serialize();virtual;
|
||||
function Marshal(): tableArray;virtual;
|
||||
|
||||
function Deserialize();
|
||||
function Serialize();
|
||||
function Marshal(): tableArray;
|
||||
function GetOrCreateNode(_obj: tslobj);
|
||||
function GetNode(): XmlNode;
|
||||
function Elements(): array of tslobj;
|
||||
function Attribute(_attr: string; _ns: string): OpenXmlAttribute;
|
||||
function Attributes(): array of OpenXmlAttribute;
|
||||
function Elements(): array of tslobj;
|
||||
function Xmlns(_prefix: string): string;
|
||||
|
||||
public
|
||||
function AppendChild(_obj: tslobj); // OpenXmlElement or OpenXmlPcdata
|
||||
function InsertAfter(_obj: tslobj; _pos_obj: tslobj);
|
||||
// function InsertBefore(_pos_obj: tslobj; _obj: tslobj);
|
||||
// function PrependChild(_obj: tslobj);
|
||||
// function RemoveChild(_obj: tslobj);
|
||||
// function SetAttribute(_obj: OpenXmlAttribute);
|
||||
protected
|
||||
function GetNode(): XmlNode;
|
||||
function DeleteSelf(): boolean;
|
||||
|
||||
public
|
||||
LocalName: string; // 本地名称
|
||||
@@ -29,14 +24,14 @@ public
|
||||
Prefix: string; // 前缀
|
||||
XmlNode: XmlNode; // XMLNode节点
|
||||
ElementName: string;
|
||||
Removed: boolean; // 节点删除标记,最后Serialize时候统一删除
|
||||
|
||||
protected
|
||||
attributes_: array of OpenXmlAttribute; // 属性
|
||||
attributes_pf_: tableArray;
|
||||
// child_elements_: array of tslobj; // 子节点元素
|
||||
xmlns_: tableArray;
|
||||
sorted_child_: tableArray;
|
||||
container_: TSOfficeContainer;
|
||||
xmlns_: tableArray;
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Create(_node: XmlNode);overload;
|
||||
@@ -46,7 +41,6 @@ begin
|
||||
if pos then {self.}Create(nil, node_name[:pos-1], node_name[pos+1:]);
|
||||
else {self.}Create(nil, nil, node_name);
|
||||
{self.}InitNode(_node);
|
||||
xmlns_ := array();
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Create(_parent: tslobj; _prefix: string; _local_name: string);overload;
|
||||
@@ -56,122 +50,31 @@ begin
|
||||
{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.}Removed := false;
|
||||
{self.}Init();
|
||||
xmlns_ := array();
|
||||
end;
|
||||
|
||||
function OpenXmlElement.InitNode(_node: XmlNode);virtual;
|
||||
function OpenXmlElement.Attribute(_attr: string; _ns: string): OpenXmlAttribute;
|
||||
begin
|
||||
{self.}XmlNode := _node;
|
||||
if not _node then return;
|
||||
tslassigning_backup := tslassigning;
|
||||
tslassigning := 1;
|
||||
node := _node.FirstChild();
|
||||
while ifObj(node) do
|
||||
begin
|
||||
node_name := node.GetName();
|
||||
arr := sorted_child_[node_name];
|
||||
if ifarray(arr) then
|
||||
begin
|
||||
pf := arr[1];
|
||||
obj := pf.Do();
|
||||
obj.InitNode(node);
|
||||
end
|
||||
node := node.NextElement();
|
||||
end
|
||||
tslassigning := tslassigning_backup;
|
||||
if ifnil(_ns) then
|
||||
attr_name := ifString({self.}Prefix) and {self.}Prefix <> "" ? format("%s:%%s", {self.}Prefix, _attr) : _attr;
|
||||
else
|
||||
attr_name := format("%s:%s", _ns, _attr);
|
||||
return attributes_[attr_name];
|
||||
end;
|
||||
|
||||
function OpenXmlElement.GetOrCreateNode(_obj: tslobj);
|
||||
function OpenXmlElement.Attributes(): array of OpenXmlAttribute;
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then {self.}XmlNode := {self.}Parent.GetOrCreateNode(self);
|
||||
nearest_node := nil;
|
||||
child_elements := container_.Get();
|
||||
for k, v in child_elements do
|
||||
begin
|
||||
if ifObj(v.XmlNode) then nearest_node := v.XmlNode;
|
||||
if v = _obj then
|
||||
begin
|
||||
if ifObj(v.XmlNode) then return v.XmlNode;
|
||||
if ifnil(nearest_node) then return {self.}XmlNode.InsertFirstChild("element", _obj.ElementName);
|
||||
else return {self.}XmlNode.InsertAfterChild(nearest_node, "element", _obj.ElementName);
|
||||
end
|
||||
end
|
||||
raise "No child.";
|
||||
end;
|
||||
|
||||
function OpenXmlElement.GetNode(): XmlNode;
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then {self.}XmlNode := {self.}Parent.GetOrCreateNode(self);
|
||||
return {self.}XmlNode;
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Deserialize();
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then return;
|
||||
attrs := {self.}XmlNode.Attributes();
|
||||
for k, v in attrs do
|
||||
begin
|
||||
pos := pos("xmlns", k);
|
||||
if pos then
|
||||
begin
|
||||
xmlns_[k] := k = "xmlns" ? new OpenXmlAttribute("", "xmlns", v) : new OpenXmlattribute("xmlns", k[pos+6:], v);
|
||||
continue;
|
||||
end
|
||||
pf := attributes_pf_[k];
|
||||
if ifnil(pf) then continue;
|
||||
pf.Do(v);
|
||||
end
|
||||
child_elements := container_.Get();
|
||||
for k, v in child_elements do
|
||||
v.Deserialize();
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Serialize();
|
||||
begin
|
||||
// xmlns
|
||||
for k, v in xmlns_ do
|
||||
{self.}GetNode().SetAttribute(v.ElementName, v.Value);
|
||||
// Attributes
|
||||
attrs := array();
|
||||
for k, v in attributes_ do
|
||||
if not ifnil(v.Value) then {self.}GetNode().SetAttribute(v.ElementName, v.Value);
|
||||
// Children
|
||||
child_elements := container_.Get();
|
||||
for k, v in child_elements do
|
||||
v.Serialize();
|
||||
attrs[length(attrs)] := v;
|
||||
return attrs;
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Marshal(): tableArray;
|
||||
function OpenXmlElement.Elements(): array of tslobj;
|
||||
begin
|
||||
child_elements := container_.Get();
|
||||
child_arr := array();
|
||||
for k, v in child_elements do
|
||||
begin
|
||||
arr := array("type": "element", "name": v.ElementName, "attributes": array());
|
||||
if v is Class(OpenXmlPcdata) or v is Class(OpenXmlElement) then
|
||||
begin
|
||||
marshal := v.Marshal();
|
||||
if length(marshal["children"]) = 0 and length(marshal["attributes"]) = 0 then continue;
|
||||
arr["children"] := marshal["children"];
|
||||
arr["attributes"] union= marshal["attributes"];
|
||||
child_arr[length(child_arr)] := arr;
|
||||
end
|
||||
else if v is Class(OpenXmlEmpty) then
|
||||
begin
|
||||
marshal := v.Marshal();
|
||||
if length(marshal) > 0 then child_arr[length(child_arr)] := arr;
|
||||
end
|
||||
else begin
|
||||
echo "error = marshal.\n";
|
||||
end
|
||||
end
|
||||
|
||||
tmp_arr := array("type": "element", "name": {self.}ElementName, "children": child_arr, "attributes": array());
|
||||
for k,v in attributes_ do
|
||||
begin
|
||||
if not ifnil(v.Value) then tmp_arr["attributes"][v.ElementName] := v.Value;
|
||||
end
|
||||
return tmp_arr;
|
||||
return container_.GetElements(false);
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Xmlns(_prefix: string): string;
|
||||
@@ -185,17 +88,20 @@ begin
|
||||
return xmlns_[k];
|
||||
end;
|
||||
|
||||
function OpenXmlElement.Elements(): array of tslobj;
|
||||
function OpenXmlElement.GetNode(): XmlNode;
|
||||
begin
|
||||
return container_.Get();
|
||||
if not ifObj({self.}XmlNode) then {self.}XmlNode := {self.}Parent.GetOrCreateNode(self);
|
||||
return {self.}XmlNode;
|
||||
end;
|
||||
|
||||
function OpenXmlElement.InsertAfter(_obj: tslobj; _pos_obj: tslobj);
|
||||
function OpenXmlElement.DeleteSelf(): boolean;
|
||||
begin
|
||||
container_.InsertAfter(_obj, _pos_obj);
|
||||
if {self.}Removed then
|
||||
begin
|
||||
if {self.}XmlNode then
|
||||
{self.}Parent.XmlNode.DeleteChild({self.}XmlNode);
|
||||
return true;
|
||||
end
|
||||
return false;
|
||||
end;
|
||||
|
||||
function OpenXmlElement.AppendChild(_obj: tslobj);
|
||||
begin
|
||||
container_.Append(_obj);
|
||||
end;
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
type OpenXmlEmpty = class
|
||||
public
|
||||
function Create(_node: XmlNode);overload;
|
||||
function Create(_parent: tslobj; _prefix: string; _local_name: string);overload;
|
||||
function InitNode(_node: XmlNode);
|
||||
|
||||
function Copy(_obj: tslobj);virtual;
|
||||
function GetNode(): XmlNode;
|
||||
function Marshal(): tableArray;
|
||||
function BoolValue(): boolean;
|
||||
function Deserialize();
|
||||
function Serialize();
|
||||
|
||||
public
|
||||
// attributes property
|
||||
XmlAttrVal;
|
||||
property Val read ReadXmlAttrVal write WriteXmlAttrVal;
|
||||
function ReadXmlAttrVal();
|
||||
function WriteXmlAttrVal(_value: any);
|
||||
|
||||
public
|
||||
LocalName: string; // 本地名称
|
||||
[weakref]Parent: tslobj; // 父类
|
||||
Prefix: string; // 前缀
|
||||
XmlNode: XmlNode; // XMLNode节点
|
||||
ElementName: string;
|
||||
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;
|
||||
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.}Val := _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
|
||||
attrs := {self.}XmlNode.Attributes();
|
||||
if length(attrs) > 1 then raise "OpenXmlEmpty.Deserialize error.\n";
|
||||
{self.}Val := nil;
|
||||
for k,v in attrs do
|
||||
{self.}Val := v;
|
||||
{self.}Value := ifnil({self.}Val) ? true : {self.}Val = "0" ? false : true;
|
||||
end
|
||||
else begin
|
||||
{self.}Value := nil;
|
||||
{self.}XmlAttrVal := 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) then
|
||||
begin
|
||||
if not ifnil({self.}XmlAttrVal.Value) then {self.}GetNode().SetAttribute({self.}XmlAttrVal.ElementName, {self.}XmlAttrVal.Value);
|
||||
end
|
||||
else begin
|
||||
if not ifnil({self.}XmlAttrVal.Value) then {self.}XmlNode.SetAttribute({self.}XmlAttrVal.ElementName, {self.}XmlAttrVal.Value);
|
||||
else if not {self.}Value and ifObj({self.}Parent.XmlNode) then{self.}Parent.XmlNode.DeleteChild({self.}XmlNode);
|
||||
end
|
||||
end;
|
||||
|
||||
function OpenXmlEmpty.BoolValue(): boolean;
|
||||
begin
|
||||
return ifnil({self.}Val) ? {self.}Value ? true : false : {self.}Val;
|
||||
end;
|
||||
|
||||
function OpenXmlEmpty.ReadXmlAttrVal();
|
||||
begin
|
||||
return {self.}XmlAttrVal.Value = "0" ? false : {self.}XmlAttrVal.Value = "1" ? true : {self.}XmlAttrVal.Value;
|
||||
end;
|
||||
|
||||
function OpenXmlEmpty.WriteXmlAttrVal(_value: any);
|
||||
begin
|
||||
if ifnil({self.}XmlAttrVal) then
|
||||
{self.}XmlAttrVal := new OpenXmlAttribute({self.}Prefix, "val", nil);
|
||||
{self.}XmlAttrVal.Value := _value;
|
||||
end;
|
||||
@@ -1,87 +0,0 @@
|
||||
type OpenXmlPcdata = class
|
||||
public
|
||||
function Create(_node: XmlNode);overload;
|
||||
function Create(_parent: tslobj; _prefix: string; _local_name: string);overload;
|
||||
function Init();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; // 属性
|
||||
attributes_pf_: 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();
|
||||
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
|
||||
if not ifObj({self.}XmlNode) then return;
|
||||
{self.}Text := {self.}XmlNode.GetText();
|
||||
attrs := {self.}XmlNode.Attributes();
|
||||
for k, v in attrs do
|
||||
begin
|
||||
pf := attributes_pf_[k];
|
||||
if ifnil(pf) then continue;
|
||||
pf.Do(v);
|
||||
end
|
||||
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;
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
type OpenXmlSimpleType = class(OpenXmlElement)
|
||||
public
|
||||
function Init();override;
|
||||
function InitNode(_node: XmlNode);override;
|
||||
function Copy(_obj: tslobj);override;
|
||||
function Deserialize();override;
|
||||
function Serialize();override;
|
||||
function Marshal(): tableArray;override;
|
||||
|
||||
public
|
||||
// attributes property
|
||||
XmlAttrVal;
|
||||
property Val read ReadXmlAttrVal write WriteXmlAttrVal;
|
||||
function ReadXmlAttrVal();
|
||||
function WriteXmlAttrVal(_value: any);
|
||||
|
||||
// 动态获取IsApplied
|
||||
// IsApplied: boolean; // 是否已经应用,和val值有关
|
||||
property IsApplied read ReadIsApplied;
|
||||
function ReadIsApplied();
|
||||
|
||||
public
|
||||
Enable: boolean; // 是否启用 <b /> 没有属性,需要通过val写属性
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.Init();override;
|
||||
begin
|
||||
{self.}Enable := false;
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.InitNode(_node: XmlNode);override;
|
||||
begin
|
||||
{self.}XmlNode := ifObj(_node) ? _node : nil;
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.Copy(_obj: tslobj);override;
|
||||
begin
|
||||
if not ifnil(_obj.Enable) then {self.}Enable := _obj.Enable;
|
||||
if not ifnil(_obj.XmlAttrVal.Value) then {self.}Val := _obj.XmlAttrVal.Value;
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.Marshal(): tableArray;override;
|
||||
begin
|
||||
if not {self.}Enable 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 OpenXmlSimpleType.Deserialize();override;
|
||||
begin
|
||||
if ifObj({self.}XmlNode) then
|
||||
begin
|
||||
attrs := {self.}XmlNode.Attributes();
|
||||
if length(attrs) > 1 then
|
||||
begin
|
||||
echo "OpenXmlSimpleType.Deserialize error.\n";
|
||||
return;
|
||||
end
|
||||
{self.}Val := nil;
|
||||
for k,v in attrs do
|
||||
{self.}Val := v;
|
||||
{self.}Enable := true;
|
||||
end
|
||||
else begin
|
||||
{self.}Enable := false;
|
||||
{self.}XmlAttrVal := nil;
|
||||
end
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.Serialize();override;
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then
|
||||
begin
|
||||
if not ifnil({self.}XmlAttrVal.Value) then {self.}GetNode().SetAttribute({self.}XmlAttrVal.ElementName, {self.}XmlAttrVal.Value);
|
||||
end
|
||||
else begin
|
||||
if not {self.}Enable or {self.}Removed then
|
||||
{self.}Parent.XmlNode.DeleteChild({self.}XmlNode);
|
||||
else if not ifnil({self.}XmlAttrVal.Value) then
|
||||
{self.}XmlNode.SetAttribute({self.}XmlAttrVal.ElementName, {self.}XmlAttrVal.Value);
|
||||
end
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.ReadXmlAttrVal();
|
||||
begin
|
||||
return {self.}XmlAttrVal.Value;
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.WriteXmlAttrVal(_value: any);
|
||||
begin
|
||||
if ifnil({self.}XmlAttrVal) then
|
||||
{self.}XmlAttrVal := new OpenXmlAttribute({self.}Prefix, "val", nil);
|
||||
{self.}XmlAttrVal.Value := _value;
|
||||
{self.}Enable := true;
|
||||
end;
|
||||
|
||||
function OpenXmlSimpleType.ReadIsApplied();
|
||||
begin
|
||||
if {self.}Enable then
|
||||
return {self.}XmlAttrVal.Value = "0" or {self.}XmlAttrVal.Value = "false" ? false : true;
|
||||
return false;
|
||||
end;
|
||||
@@ -0,0 +1,59 @@
|
||||
type OpenXmlTextElement = class(OpenXmlElement)
|
||||
public
|
||||
function InitNode(_node: XmlNode);override;
|
||||
function Copy(_obj: tslobj);virtual;
|
||||
function Deserialize();override;
|
||||
function Serialize();override;
|
||||
function Marshal(): tableArray;override;
|
||||
|
||||
public
|
||||
Text: string; // 元素的文本内容
|
||||
end;
|
||||
|
||||
function OpenXmlTextElement.InitNode(_node: XmlNode);override;
|
||||
begin
|
||||
{self.}XmlNode := ifObj(_node) ? _node : nil;
|
||||
end;
|
||||
|
||||
function OpenXmlTextElement.Copy(_obj: tslobj);virtual;
|
||||
begin
|
||||
if not ifnil(_obj.Text) then {self.}Text := _obj.Text;
|
||||
end;
|
||||
|
||||
function OpenXmlTextElement.Marshal(): tableArray;override;
|
||||
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 OpenXmlTextElement.Deserialize();override;
|
||||
begin
|
||||
if not ifObj({self.}XmlNode) then return;
|
||||
{self.}Text := {self.}XmlNode.GetText();
|
||||
attrs := {self.}XmlNode.Attributes();
|
||||
for k, v in attrs do
|
||||
begin
|
||||
pos := pos("xmlns", k);
|
||||
if pos then
|
||||
begin
|
||||
xmlns_[k] := k = "xmlns" ? new OpenXmlAttribute("", "xmlns", v) : new OpenXmlattribute("xmlns", k[pos+6:], v);
|
||||
continue;
|
||||
end
|
||||
pf := attributes_pf_[k];
|
||||
if ifnil(pf) then continue;
|
||||
pf.Do(v);
|
||||
end
|
||||
end;
|
||||
|
||||
function OpenXmlTextElement.Serialize();override;
|
||||
begin
|
||||
if {self.}DeleteSelf() then return;
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user