anchor.diff:      // function, this function will search the whole subnode tree. If you use
       // a TsdNodeList for the AList parameter, you don't need to cast the list
       // items to TXmlNode.
  -    procedure FindNodes(const NodeName: Utf8String; const AList: TList); virtual;
  +    procedure FindNodes(const NodeName: Utf8String; const AList: TList); overload; virtual;
  +    procedure FindNodes(const NodeName: array of Utf8String; const AList: TList); overload; virtual;
       // Iterates the next sibling of Node
       function NextSibling(ANode: TXmlNode): TXmlNode; virtual;
       // Return the first subnode with AType, or nil if none
  
positive.code:     // function works recursively, using the depthfirst method.
      function NodeByAttributeValue(const NodeName, AttribName, AttribValue: Utf8String;
        ShouldRecurse: boolean = True): TXmlNode; overload;
      {$ifdef D7UP}
      function NodeByAttributeValue(const NodeName, AttribName: Utf8String;
        const AttribValue: UnicodeString; ShouldRecurse: boolean = True): TXmlNode; overload;
  
negative.code:       SubNode := ANode.Nodes[i];
        if SubNode.CompareNodeName(NodeName) = 0 then
          AList.Add(SubNode);
        FindNodesRecursive(SubNode, AList);
      end;
    end;
  // main
  begin
    AList.Clear;
    FindNodesRecursive(Self, AList);
  end;
  
  procedure TXmlNode.FindNodes(const NodeName: array of Utf8String; const AList: TList);
    // local
    procedure FindNodesRecursive(ANode: TXmlNode; AList: TList);
    var
      i,j: integer;
      SubNode: TXmlNode;
    begin
      for i := 0 to ANode.NodeCount - 1 do
      begin
        SubNode := ANode.Nodes[i];
        for j:=Low(NodeName) to High(NodeName) do
          if SubNode.CompareNodeName(NodeName[j]) = 0 then
            AList.Add(SubNode);
        FindNodesRecursive(SubNode, AList);
      end;
    end;
  