FileMakerPROでxmlデータを扱う

FileMakerでデータをインポートするには「ファイル」->「レコードのインポート」から、もしくはスクリプトの「レコードのインポート」から行える。
2012y05m21d_230857233.png
ファイルの中身のインポート、フォルダ内のファイル自体をインポート、ODBCを介して直接他データベースからSQLを発行してインポート
そして、xmlを経由してのデータインポートがある。
下記はxmlを使用した場合のデータインポートの例。
様式:

  • 特定のサーバにhttpリクエストを送信して、その結果をxml形式として得る。xsltもhttp経由で得る。
  • FMサーバ内にあるスクリプトを起動させ、その出力をxml形式とさせて得る。xsltは既に登録させている。

といった方式がありえるかと。

おまじない的なテンプレートxslt。ほとんどすべてこれで足りるかと。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
       <ERRORCODE>0</ERRORCODE>
       <PRODUCT BUILD="" NAME="" VERSION=""/>
       <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(/*/*)}" TIMEFORMAT="h:mm:ss a"/>
       <METADATA>
               <!-- xsl:for-eachで一つのFIELDエレメントを決めている -->
               <xsl:for-each select="/*/*[position()=1]/*">
               <FIELD>
               <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
               <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
               <xsl:attribute name="NAME"><xsl:value-of select="name()"/></xsl:attribute>
               <xsl:attribute name="TYPE">TEXT</xsl:attribute>
               </FIELD>
               </xsl:for-each>
       </METADATA>
       <RESULTSET>
               <xsl:attribute name="FOUND"><xsl:value-of select="count(child::*)"/></xsl:attribute>
               <xsl:for-each select="child::*">
               <ROW>
                       <xsl:attribute name="MODID">0</xsl:attribute>
                       <xsl:attribute name="RECORDID">0</xsl:attribute>
                       <xsl:for-each select="child::*">
                       <COL>
                               <DATA>
                               <xsl:value-of select="."/>
                               </DATA>
                       </COL>
                       </xsl:for-each>
               </ROW>
               </xsl:for-each>
       </RESULTSET>
</FMPXMLRESULT>

これを、http経由で得られるようにするか、FM内部に予め登録しておきます。
次に、実際に取り込むデータですが、http要求、もしくはスクリプトの実行結果として、下記の様式で得られるようにします。

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xml" href=""?>
<root>
       <child>
               <query>0000011</query>
               <hit>hsa2840</hit>
               <start>75</start>
               <end>326</end>
               <score>312</score>
               <evalue>2.8e-102</evalue>
               <date>2007-10-04</date>
       </child>
</root>

kegg-human配列へblast検索を実施した結果を上記のようなxmlで得たとします。上記のxsltとこのxmlでインポート/更新が可能になります。
httpリクエストの変数にquery:0000011を入れて、blast検索サーバに繋げ、リクエストを受けたサーバは、CGIを介してblast検索を
実行して、その結果をxml形式にして出力する。そういった流れ。CGIはBioPerlとかで賄えば宜しいかと

下記はFMサーバ内にあるWindowsSerch全文検索に対して「天使」なる言葉を含むファイル検索を依頼して、その出力をxmlで得る場合の例である。
vbsなファイルです。

set conn = CreateObject("ADODB.Connection")
   conn.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
set rs = CreateObject("ADODB.recordset")
rs.open "SELECT System.FileName FROM SYSTEMINDEX where CONTAINS('天使'), conn
set io = CreateObject("Scripting.FileSystemObject")
set fs = io.OpenTextFile("test.txt",2,true)
fs.writeLine("<?xml version="1.0" encoding="UTF-8" ?>")
fs.writeLine("<?xml-stylesheet type="text/xml" href=""?>")
fs.writeLine("<root>")
Do while rs.EOF <> true
   Wscript.Echo rs.Fields.Item("System.FileName")
   fs.writeline("<child><fileName>" & rs.Fields.Item("System.FileName") & "</fileName></child>" )
   rs.MoveNext 
Loop 
fs.writeLine("</root>")
rs.Close
conn.close
fs.close

これをFMのeventで実行させると、下記のような出力となる。

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xml" href=""?>
<root>
       <child>
               <fileName>C:\Users\foo\Document\sample.doc</fileName>
       </child>
</root>

*注意点
httpを経由したxmlインポート/更新は問題ないのだが、内部にあるvbsなスクリプトを実施して、その結果を取り込む場合、
vbsの出力ファイルの完成を待たず、FMへのインポートを開始してしまう事がある。それゆえ、出力ファイルを確認してからの
FMへの取り込みと言った予防策を張る必要が生じる。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2012-05-21 (月) 23:49:08 (3115d)