Esto debe darle un buen comienzo y la idea usando DOM:
uses
MSHTML,
ActiveX,
ComObj;
procedure DocumentFromString(Document: IHTMLDocument2; const S: WideString);
var
v: OleVariant;
begin
v := VarArrayCreate([0, 0], varVariant);
v[0] := S;
Document.Write(PSafeArray(TVarData(v).VArray));
Document.Close;
end;
function StripMultipleChar(const S: string; const C: Char): string;
begin
Result := S;
while Pos(C + C, Result) <> 0 do
Result := StringReplace(Result, C + C, C, [rfReplaceAll]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Document: IHTMLDocument2;
Elements: IHTMLElementCollection;
Element: IHTMLElement;
I: Integer;
Line: string;
begin
Document := CreateComObject(CLASS_HTMLDocument) as IHTMLDocument2;
DocumentFromString(Document, '<head>...'); // your HTML here
Elements := Document.all.tags('A') as IHTMLElementCollection;
for I := 0 to Elements.length - 1 do
begin
Element := Elements.item(I, '') as IHTMLElement;
Memo1.Lines.Add('A HREF=' + Element.getAttribute('HREF', 2));
Memo1.Lines.Add('A innerText=' + Element.innerText);
// Text is returned immediately before the element
Line := (Element as IHTMLElement2).getAdjacentText('beforeBegin');
// Line => "Mittwoch, 30. März 2011 12:01 <dir>" OR:
// Line => "Mittwoch, 9. Februar 2005 17:14 113"...
// I don't know what is the actual delimiter:
// It could be [space] or [tab] so we need to normalize the Line
// If it's tabs then it's easier because the timestamps also contains spaces
Line := Trim(Line);
Line := StripMultipleChar(Line, #32); // strip multiple Spaces sequences
Line := StripMultipleChar(Line, #9); // strip multiple Tabs sequences
// TODO: ParseLine (from right to left)
Memo1.Lines.Add(Line);
Memo1.Lines.Add('-------------');
end;
end;
Salida:
A HREF=/SubDir/
A innerText=SubDir
Mittwoch, 30. März 2011 12:01 <dir>
-------------
A HREF=/file.txt
A innerText=file.txt
Mittwoch, 9. Februar 2005 17:14 113
-------------
EDIT:
He cambiadoLa implementaciónes más simplificada. sin embargo, creo que la versión anterior era más optimizada para acelerar. considerando el hecho de que las líneas son muy cortas en longitud, no habrá muchas diferencias en el rendimiento.
¿Tiene una muestra? En realidad, no existe una "lista de directorio" estándar (bueno, de hecho, hay * varios *, dependiendo del servidor y del sistema operativo en el que se esté ejecutando), y sin saber con qué está trabajando es difícil saber qué podría hacer. necesito hacer. –
lo que necesita es un analizador HTML que crea un árbol, por lo que sería fácil encontrar todas las etiquetas "A" y actuar de acuerdo a sus necesidades. – ComputerSaysNo
Si el servidor es compatible con WebDAV, una solución más robusta sería fácil de implementar con una biblioteca de cliente WebDAV. Cada actualización de versión de servidor o cambio de software rompería un analizador específico para este resultado HTML. – mjn