Skip to content

FindNodes function not recursive #5

@ulutepe

Description

@ulutepe

fix with this

function TXmlNodeList.FindNodes(const Name: String; NodeTypes: TXmlNodeTypes = [ntElement]): TXmlNodeList;
var
  Node: TXmlNode;
begin
  Result          := TXmlNodeList.Create(False);
  Result.Document := Document;
  try
    for Node in Self do
      if ((NodeTypes = []) or (Node.NodeType in NodeTypes)) and IsSame(Node.Name, Name) then
      begin
        Result.Parent := Node.Parent;
        Result.Add(Node);
      end;
    Result.Parent := NIL;
  except
    Result.Free;
    raise;
  end;
end;
function TXmlNode.Find(const Name: String; NodeTypes: TXmlNodeTypes = [ntElement]): TXmlNode;
var
  cur: TXmlNode;
begin
  Result := ChildNodes.Find(Name, NodeTypes);
  if not Assigned(Result) then
    if ChildNodes.Count > 0 then
    begin
      cur    := Self.ChildNodes[0];
      Result := cur.Find(Name, NodeTypes);
    end;
end;



function TXmlNode.Find(const Name, AttrName, AttrValue: String; NodeTypes: TXmlNodeTypes = [ntElement]): TXmlNode;
var
  cur: TXmlNode;
begin
  Result := ChildNodes.Find(Name, AttrName, AttrValue, NodeTypes);
  if not Assigned(Result) then
    if ChildNodes.Count > 0 then
    begin
      cur    := Self.ChildNodes[0];
      Result := cur.Find(Name, AttrName, AttrValue, NodeTypes);
    end;
end;



function TXmlNode.Find(const Name, AttrName: String; NodeTypes: TXmlNodeTypes = [ntElement]): TXmlNode;
var
  cur: TXmlNode;
begin
  Result := ChildNodes.Find(Name, AttrName, NodeTypes);
  if not Assigned(Result) then
    if ChildNodes.Count > 0 then
    begin
      cur    := Self.ChildNodes[0];
      Result := cur.Find(Name, AttrName, NodeTypes);
    end;
end;



function TXmlNode.FindNodes(const Name: String; NodeTypes: TXmlNodeTypes = [ntElement]): TXmlNodeList;
var
  cur: TXmlNode;
begin
  Result := ChildNodes.FindNodes(Name, NodeTypes);
  if Assigned(Result) then
    if Result.Count = 0 then
      if ChildNodes.Count > 0 then
      begin
        FreeAndNil(Result); // free because its created temp
        cur    := Self.ChildNodes[0];
        Result := cur.FindNodes(Name, NodeTypes);
      end;
end;

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions