- Код: Выделить всё
procedure TOODocument.SetMetaData(const AValue: TMYData);
var RootNode,Node: TDOMNode;
begin
RootNode:=FMeta.DocumentElement.FindNode('office:meta');
if RootNode = Nil then
RootNode:=FMeta.CreateElement('office:meta');
Node:=RootNode.FindNode('dc:description');
Node.Free;// удаляем чтоб не плодить двойников с тэгом 'dc:description'
if AValue.Description<>'' then
begin
Node:=FMeta.CreateElement('dc:description');
Node.TextContent:=AValue.Description;
RootNode.AppendChild(Node);
end;
FMeta.DocumentElement.AppendChild(RootNode);
end;
Но пройдясь по исходникам наткнулся на такую интересную вещь:
- Код: Выделить всё
function TDOMNode.FindNode(const ANodeName: DOMString): TDOMNode;
begin
// FIX: we have no children, hence cannot find anything
Result := nil;
end;
Но вот почему же процедура работала? Далее пошел по пути FMeta.DocumentElement.FindNode('dc:description'); Где в исходниках видно, что действительно возвращаем Node:
- Код: Выделить всё
function TDOMNode_WithChildren.FindNode(const ANodeName: DOMString): TDOMNode;
begin
Result := FFirstChild;
while Assigned(Result) do
begin
if Result.CompareName(ANodeName)=0 then
Exit;
Result := Result.NextSibling;
end;
end;
Переписал процедуру вот так:
- Код: Выделить всё
procedure TOODocument.SetMetaData(const AValue: TOOMetaData);
var RootNode,Node: TDOMNode;
Exist:Boolean;
I:Integer;
begin
RootNode:=FMeta.DocumentElement.FindNode('office:meta');
if RootNode = Nil then
RootNode:=FMeta.CreateElement('office:meta');
Exist:=False;
for I:=0 to RootNode.ChildNodes.Count-1 do
begin
if RootNode.ChildNodes[I].NodeName='dc:description' then
begin
RootNode.ChildNodes[I].TextContent:=AValue.Description;
Exist:=True;
break;
end;
end;
RootNode.ChildNodes.Free;
if Exist = False then
begin
Node:=FMeta.CreateElement('dc:description');
Node.TextContent:=AValue.Description;
RootNode.AppendChild(Node);
end;
FMeta.DocumentElement.AppendChild(RootNode);
End;
Тоже работает, так мне в первом случае просто магическим образом повезло? Или это ошибка была позднее закрыта? Или я что-то не понял?. Ведь по идее нужно работать через ChildNodes?
Lazarus ver 0.9.29 svn 26447