0

我在使用流时遇到问题。我想逐行阅读我的html代码。通过逐行读取文件我没有问题,但我需要使用 webbrowser 读取实际打开的文档,所以我写了这个:

procedure TForm2.SpeedButton2Click(Sender: TObject);
var
    iall : IHTMLElement;
    strumien : TStringStream;
    reader : TStreamReader;
begin
  if Assigned(WebBrowser1.Document) then
    begin
      iall := (WebBrowser1.Document AS IHTMLDocument2).body;
      while iall.parentElement <> nil do
        begin
          iall := iall.parentElement;
        end;
      Strumien:=Tstringstream.Create(iall.innerHTML);
      Strumien.Position:=0;
      reader:=TStreamReader.Create(Strumien, TEncoding.UTF8);
      reader.OwnStream;
      while not reader.EndOfStream do
        memo1.Lines.Add(reader.ReadLine);
    end;
end;

此代码不起作用。从文档中心仅读取几行并给出“列表索引超出范围”有人知道为什么吗?使用 Embarcadero XE2 Delphi

非常感谢!

4

1 回答 1

2

您将不同的字符串编码混合在一起,这可能解释了为什么TStreamReader无法正确读取所有内容。 TStringStream也在TEncodingD2009+ 中使用,但您没有TEncoding在构造函数中指定任何类型TStringStream,因此它将使用TEncoding.Default,这与编码不同TEncoding.UTF8。因此,您正在获取原始 UTF-16 编码的 HTML 字符串,将其转换为操作系统默认的 Ansi 编码,然后尝试将其作为 UTF-8 读回。这只有在数据中不包含任何非 ASCII 字符时才有效。

试试这个:

procedure TForm2.SpeedButton2Click(Sender: TObject);   
var   
  iall : IHTMLElement;   
  iparent : IHTMLElement;   
  strumien : TStringStream;   
  reader : TStreamReader;   
  s: String;
begin   
  if Assigned(WebBrowser1.Document) then   
  begin   
    iall := (WebBrowser1.Document AS IHTMLDocument2).body;   
    iparent := iall.parentElement;
    while iparent <> nil do
    begin
      iall := iparent;
      iparent := iparent.parentElement;   
    end;
    Strumien := TStringStream.Create(iall.innerHTML, TEncoding.UTF8, False);   
    try
      Strumien.Position := 0;
      reader := TStreamReader.Create(Strumien, TEncoding.UTF8);   
      try
        while not reader.EndOfStream do   
        begin
          s := reader.ReadLine;
          // use s as needed...
        end; 
      finally
        reader.Free;
      end;
    finally
      Strumien.Free;
    end;
  end;   
end;   

在将文档加载到 a 的特定情况下TMemo,您根本不需要TStringStreamor TStreamReader

procedure TForm2.SpeedButton2Click(Sender: TObject);   
var   
  iall : IHTMLElement;   
  iparent : IHTMLElement;   
begin   
  if Assigned(WebBrowser1.Document) then   
  begin   
    iall := (WebBrowser1.Document AS IHTMLDocument2).body;   
    iparent := iall.parentElement;
    while iparent <> nil do
    begin
      iall := iparent;
      iparent := iparent.parentElement;   
    end;
    Memo1.Text := iall.innerHTML;   
  end;   
end;   
于 2012-08-29T19:08:06.600 回答