TStreamReader从WebBrowser Delphi读取HTML代码

时间:2012-08-29 14:21:44

标签: delphi stream browser activex

我在使用流时遇到问题。我想逐行阅读我的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

非常感谢!

1 个答案:

答案 0 :(得分:2)

您正在将不同的字符串编码混合在一起,这可能会解释TStreamReader无法正确读取所有内容的原因。 TStringStream在D2009 +中也使用TEncoding,但您未在TEncoding构造函数中指定任何TStringStream类型,因此它将使用TEncoding.Default,而不是TEncoding.UTF8procedure 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; 编码相同。因此,您将使用原始的UTF-16编码HTML字符串,将其转换为操作系统默认的Ansi编码,然后尝试将其读回为UTF-8。只有当数据中不包含任何非ASCII字符时,这才有效。

请改为尝试:

TMemo

在将文档加载到TStringStream的特定情况下,您根本不需要TStreamReaderprocedure 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;

{{1}}