Web上のXMLファイルを見やすい形でWebBrowserに受け取るには?

解決


あるく  2006-06-16 05:56:41  No: 22200

初めまして。お世話になります。
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に受け取る方法を、どうかご教授お願いします。


Fusa  2006-06-16 09:25:42  No: 22201

以前まとめたメモがありましたので、どうぞ。
ブラウザで読み込んだ内容を変換して出力する方法です。

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


あるく  2006-06-16 12:38:53  No: 22202

返信ありがとうございました。
ブラウザに表示されているHTMLのソース表示や任意のHTMLソース文字列を渡して表示することはできたのですが、表示しているXMLのタグ部分をなくして見やすくするところまでが出来ないでいます…。
今は試しにamazonでRESTによりECSへアクセスすることによって得られるXMLを見やすくしようとしているのですが、例えば

http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=01VJ9SBK29PKQ22ZNCR2&AssociateTag=macinbasic-22&Operation=ItemLookup&ResponseGroup=Small&ItemId=4756142281&Version=2005-10-05

というURLにアクセスして得たXMLのタグ部分を省いて著者と本のタイトル名だけ表示したい場合、上記のプログラムの

ShowMessage(GetDocumentSourceTWebBrowser(WebBrowser1));

の様にソースを得た後、どのように変更してタグを省略し

sl.Text := '<html><body bgcolor="#ff0000">てすと</html>';

の様に送り出せばいいのでしょうか。
ご教授お願いいたします。


Fusa  2006-06-17 07:55:05  No: 22203

ということは、XMLのソースパーサーをどう使うのか、
って話になりますね。

自分で字句解析しても良さそうですが

この際、せっかくなので
XMLの扱い方を学びたくなって、調べてみました。

D2006では動作確認しました。
http://www.wwlnk.com/boheme/delphi/tips/tec1660.htm
これみて、応用してください。

動作イメージは、こちらに乗せてみました。
http://blog65.fc2.com/d/delfusa/file/XMLDocumentSample.jpg

XMLってこうやって扱うと楽です。
TXMLDocumentのもっと沢山のおもしろい使い方を
誰か解説してくれないっすかね。


Shim  2006-06-24 03:59:24  No: 22204

せっかくのXMLなので、XMLのDOMオブジェクトとして解析させるのが一番てっとり早いのではないでしょうか?
再帰で、最深ノードまで探索してはそれがテキストノードなのかどうかを調べるといった事を繰り返せば、テキストのみを取得できそうですけど。


あるく  2006-06-25 11:13:34  No: 22205

Fusaさん、Shimさん、返信ありがとうございました。
参考資料を頼りに何とか表示させることができました。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加