初めまして。お世話になります。
Delphi7で簡易ブラウザを作成したのですが、Web上にある
<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
<data id="1">
<name>suzuki</name>
<url>aaa</url>
<mail>bbb</mail>
</data>
<data id="2">
<name>sato</name>
<url>ccc</url>
<mail>ddd</mail>
</data>
</root>
などの内容のXMLファイルにアクセスしてWebBrowserで読み込ませた時に、複雑なツリー表示ではなく
suzuki
aaa
bbb
sato
ccc
ddd
というように見やすい形で表示させるようにしたいと考えています。
XMLDocumentなどを使い試行錯誤を繰り返しているのですが、自分のPCに保存してある特定のXMLファイルを読み込んで作業を行うことはできるのですが、ブラウザでXMLファイルにアクセスした時に簡易表示をするという作業ができません。
Web上のXMLファイルにアクセスして簡易表示でWebBrowserに受け取る方法を、どうかご教授お願いします。
以前まとめたメモがありましたので、どうぞ。
ブラウザで読み込んだ内容を変換して出力する方法です。
-- TWebBrowser で表示している画面のHTMLソースを取得して変換表示する方法 --
TWebBrowser で表示している画面のHTMLソースを取得する方法と
TWebBrowser に任意のHTMLソース文字列を渡して表示させる方法
両方を使って、既存の見ているページのタグの内容を書き換えて
表示することができます。
次のソースを参考にしてください。
────────────────────
uses ActiveX, AxCtrls,
//uses AxCtrls
function IStreamToString(pStream: IStream): string;
var
st : TStringStream;
os : TOLEStream;
begin
result := '';
os := TOLEStream.Create(pstream);
st := TSTringStream.Create('');
try
st.CopyFrom(os, 0);
st.Seek(0, 0);
setstring(result, pchar(st.datastring), st.size);
finally
st.free;
os.free;
end;
end;
//uses ActiveX
function GetDocumentSourceTWebBrowser(WebBrowser: TWebBrowser): Widestring;
var
pPStm : IPersistStreamInit;
pStream : IStream;
hMem : HGLOBAL ;
begin
pPStm := WebBrowser.document as IPersistStreamInit;
hMem := GlobalAlloc(GHND , 0 );
CreateStreamOnHGlobal(Hmem, TRUE, pStream);
pPStm.Save(pstream , true);
result := IStreamToString( pstream);
end;
//これでブラウザで表示されているソースが表示される
procedure TMainForm.Button1Click(Sender: TObject);
begin
ShowMessage(GetDocumentSourceTWebBrowser(WebBrowser1));
end;
procedure TMainForm.Button2Click(Sender: TObject);
var
sl: TStringList;
ms: TMemoryStream;
begin
WebBrowser.Navigate('about:blank');
if Assigned(WebBrowser1.Document) then begin
sl := TStringList.Create;
ms := TMemoryStream.Create;
try
// HTML を TStringList に作る(直接 Stream でも可能)
sl.Text := '<html><body bgcolor="#ff0000">てすと</html>';
sl.SaveToStream(ms);
ms.Seek(0, 0);
(WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
sl.Free;
end;
end;
end;
────────────────────
参考────────────────────
[Delphi:47961] Re: TWebBrowserを使って、HTMLソースを取得したいんですが
[Delphi:48941] メモリーリーク?
http://www.monazilla.org/document/directwrite.html
> 170 名前: ななしくん(もなR) 投稿日: 2001/06/12(火) 13:35
> ・WebBrowser に直接 HTML を表示する方法(で良いのかな?)
> uses に ActiveX を追加する。
> var
> sl: TStringList;
> ms: TMemoryStream;
> begin
> WebBrowser.Navigate('about:blank');
> if Assigned(WebBrowser.Document) then begin
> sl := TStringList.Create;
> ms := TMemoryStream.Create;
> try
> // HTML を TStringList に作る(直接 Stream でも可能)
> sl.Text := '<html><body bgcolor="#ff0000">てすと</html>';
> sl.SaveToStream(ms);
> ms.Seek(0, 0);
> (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
> finally
> ms.Free;
> sl.Free;
> end;
> end;
返信ありがとうございました。
ブラウザに表示されているHTMLのソース表示や任意のHTMLソース文字列を渡して表示することはできたのですが、表示しているXMLのタグ部分をなくして見やすくするところまでが出来ないでいます…。
今は試しにamazonでRESTによりECSへアクセスすることによって得られるXMLを見やすくしようとしているのですが、例えば
というURLにアクセスして得たXMLのタグ部分を省いて著者と本のタイトル名だけ表示したい場合、上記のプログラムの
ShowMessage(GetDocumentSourceTWebBrowser(WebBrowser1));
の様にソースを得た後、どのように変更してタグを省略し
sl.Text := '<html><body bgcolor="#ff0000">てすと</html>';
の様に送り出せばいいのでしょうか。
ご教授お願いいたします。
ということは、XMLのソースパーサーをどう使うのか、
って話になりますね。
自分で字句解析しても良さそうですが
この際、せっかくなので
XMLの扱い方を学びたくなって、調べてみました。
D2006では動作確認しました。
http://www.wwlnk.com/boheme/delphi/tips/tec1660.htm
これみて、応用してください。
動作イメージは、こちらに乗せてみました。
http://blog65.fc2.com/d/delfusa/file/XMLDocumentSample.jpg
XMLってこうやって扱うと楽です。
TXMLDocumentのもっと沢山のおもしろい使い方を
誰か解説してくれないっすかね。
せっかくのXMLなので、XMLのDOMオブジェクトとして解析させるのが一番てっとり早いのではないでしょうか?
再帰で、最深ノードまで探索してはそれがテキストノードなのかどうかを調べるといった事を繰り返せば、テキストのみを取得できそうですけど。
Fusaさん、Shimさん、返信ありがとうございました。
参考資料を頼りに何とか表示させることができました。
本当にありがとうございました。
ツイート | ![]() |