Helpex - Trao đổi & giúp đỡ Đăng nhập
1

Hãy tưởng tượng có một tệp html rất lớn với tất nhiên là rất nhiều thẻ html. Tôi không thể tải toàn bộ tệp vào bộ nhớ.

Ý định của tôi là trích xuất tất cả các chỉ mục cho chuỗi <p>này và </p>chuỗi này . Làm thế nào tôi nên đạt được nó? Hãy gợi ý một số hướng để tôi thực hiện.

1 hữu ích 2 bình luận 430 xem chia sẻ
2

Một ví dụ sử dụng các luồng tệp:

/// <summary>
/// Get a collection of index,string for everything inside p tags in the html file
/// </summary>
/// <param name="htmlFilename">filename of the html file</param>
/// <returns>collection of index,string</returns>
private Dictionary<long, string> GetHtmlIndexes(string htmlFilename)
{
    //init result
    Dictionary<long, string> result = new Dictionary<long, string>();

    StreamReader sr = null;
    try
    {
        sr = new StreamReader(htmlFilename);
        long offsetIndex = 0;
        while (!sr.EndOfStream)
        {

            string line = sr.ReadLine(); //assuming html isn't condensed into 1 single line
            offsetIndex += line.Length;  //assuming 'index' you require is the file offset
            int openingIndex = line.IndexOf(@"<p");
            int closingIndex = line.IndexOf(@">");
            if ( openingIndex > -1)
            {
                int contentIndex = openingIndex + 3; // as in <p tag or <p>tag
                string pTagContent = line.Substring( contentIndex);
                if(closingIndex> contentIndex)
                {
                    int tagLength = closingIndex - contentIndex;
                    pTagContent = line.Substring( contentIndex, tagLength);
                }
                //else, the tag finishes on next or subsequent lines and we only get content from this line

                result.Add(offsetIndex + contentIndex, pTagContent);
            }


        } //end file loop

    }
    catch (Exception ex)
    {
        //handle error ex
    }
    finally
    {
        if(sr!=null)
            sr.Close();
    }


    return result;
}

Điều này có những hạn chế mà bạn có thể thấy từ các bình luận. Tôi nghi ngờ sử dụng LINQ sẽ gọn gàng hơn rất nhiều. Tôi hy vọng điều này mang lại cho bạn một điểm khởi đầu?

2 hữu ích 1 bình luận chia sẻ
3

Sử dụng các luồng tệp, bạn sẽ có thể tải tệp theo từng phần có kích thước vài kb. Giữ một chỉ mục về vị trí tệp hiện tại của bạn khi bạn tải từng đoạn. Quét đoạn để tìm chuỗi bạn đang tìm kiếm và thêm phần bù của nó vào chỉ mục của bạn. Giữ một danh sách tất cả các chỉ mục bạn tìm thấy.

3 hữu ích 0 bình luận chia sẻ
2

Bạn nên dùng thử Html Agility Pack .

2 hữu ích 1 bình luận chia sẻ
2

Nếu html của bạn là XHTML thuần túy, thì bạn có thể coi nó như một tài liệu XML. Tải XHTML của bạn bằng a System.Xml.XmlDocumentvà sau đó sử dụng GetElementsByTagName("p")phương pháp này để trả về danh sách các thẻ <p>. Điều này an toàn và dễ dàng hơn nhiều so với việc cố gắng phân tích cú pháp html trực tiếp.

2 hữu ích 0 bình luận chia sẻ
1

Tôi sẽ bắt đầu bằng cách tạo một trình mã hóa HTML, sử dụng IEnumerable, yield returnv.v. sẽ đơn giản. Nó có thể đọc một tệp char-by-char bằng cách sử dụng StreamReader.Readvà một máy trạng thái switchsẽ quyết định trạng thái hiện tại và mang lại một chuỗi các mã thông báo hoặc Tuples.

Tôi đã tìm thấy một trình mã hóa HTML cũ ở đây (một phần của công cụ blog BlogX cũ của Chris Anderson ) có thể được điều chỉnh để trở thành cơ sở của một giải pháp có thể giải quyết được vấn đề.

1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ .net vb.net file-io , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading