2012-02-23 11 views
7

शुभ दिन! मैं डेल्फी एक्सई और इंडी टीआईडीएचटीटीपी का उपयोग कर रहा हूं। विधि प्राप्त करने का उपयोग करके मुझे दूरस्थ निर्देशिका सूची मिलती है और मुझे इसे पार्स करने की आवश्यकता होती है = फ़ाइलों को उनके आकार और टाइमस्टैम्प के साथ प्राप्त करें और फ़ाइलों और उपनिर्देशिकाओं को अलग करें। कृपया, क्या ऐसा करने के लिए एक अच्छी दिनचर्या है? आपका अग्रिम में ही बहुत धन्यवाद!पार्स HTTP निर्देशिका लिस्टिंग

<head> 
    <title>127.0.0.1 - /</title> 
</head> 
<body> 
    <H1>127.0.0.1 - /</H1><hr> 
<pre>  
    Mittwoch, 30. März 2011 12:01  &lt;dir&gt; <A HREF="/SubDir/">SubDir</A><br /> 
    Mittwoch, 9. Februar 2005 17:14   113 <A HREF="/file.txt">file.txt</A><br /> 
</pre> 
<hr> 
</body> 
+4

क्या आपके पास नमूना है? वास्तव में एक मानक "निर्देशिका सूची" नहीं है (वास्तव में, सर्वर पर निर्भर करता है और ओएस यह चल रहा है), और यह जानने के बिना कि आप किसके साथ काम कर रहे हैं, यह बताना मुश्किल है कि आप क्या कर सकते हैं करना पडेगा। –

+1

जो आपको चाहिए वह एक HTML पार्सर है जो एक पेड़ बनाता है, इसलिए सभी "ए" टैग ढूंढना और आपकी आवश्यकताओं के अनुसार कार्य करना आसान होगा। – ComputerSaysNo

+1

यदि सर्वर WebDAV का समर्थन करता है तो एक और मजबूत समाधान WebDAV क्लाइंट लाइब्रेरी के साथ कार्यान्वित करना आसान होगा। प्रत्येक सर्वर संस्करण अद्यतन या सॉफ़्टवेयर परिवर्तन इस HTML आउटपुट के लिए एक पार्सर विशिष्ट तोड़ देगा। – mjn

उत्तर

7

कोड नमूना देखते हुए, मैं सबसे तेजी से रास्ता पार्स करने के लिए इसे इस तरह होगा लगता है: Vojtech

यहाँ नमूना है

  • युक्त <pre>...</pre> ब्लॉक पहचानें सभी लिस्टिंग लाइनें आसान होना चाहिए।
  • <pre> और </pre> के बीच TStringList में सबकुछ रखें। प्रत्येक पंक्ति एक फ़ाइल या फ़ोल्डर है, और प्रारूप बहुत सरल है।
  • प्रत्येक पंक्ति से लिंक निकालें, यदि आपको इसकी आवश्यकता हो तो तिथि, समय और आकार निकालें। रेगेक्स के साथ सबसे अच्छा किया गया (आपको डेल्फी एक्सई मिल गया है ताकि आपको अंतर्निहित रेगेक्स मिल गया हो)।
+6

+1। जब आपके पास नमूना होता है तो यह आसान होता है। क्या तुम खुश नहीं हो मैंने पूछा? :) –

7

यह आपको एक अच्छी शुरुआत और विचार डोम का उपयोग कर देना चाहिए:

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; 

आउटपुट:

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 
------------- 

संपादित करें:
मैंबदल गया हैकार्यान्वयन अधिक को सरलीकृत किया गया। फिर भी मैं पूर्व संस्करण को विश्वास करता हूं अनुकूलित करने के लिए अनुकूलित किया गया था। इस तथ्य पर विचार करते हुए कि रेखाएं लंबाई में बहुत कम हैं, प्रदर्शन में कोई अंतर नहीं होगा।

+0

+1 क्योंकि यह काम करेगा। 'StripMultipleChar' को थोड़ा सा सरल बनाया जा सकता है। –

+0

इसे * सरलीकृत * और * अनुकूलित * किया जा सकता है। आपके पास इतने सारे * हैं * लूप्स वहां मेरे सिर स्पिन बनाता है: आपको केवल एक ही, लूप के लिए सीधे-आगे की आवश्यकता है। –

+0

@Cosmin Prund, मेरा संपादन देखें।पूर्व समारोह वास्तव में जेसीएल इकाइयों में से एक पर आधारित था ... – kobik

संबंधित मुद्दे