1.程序需求javascript
在NAS上(能夠理解爲局域網上一個存放了若干文件的IP地址),有若干個DBF文件,它們佔用的空間都不大。如今要作一個功能,就是把這些文件每隔一段時間,作一個快照,以XML形式保存DBF文件的值。並把XML文檔保存到指定位置,用已經寫好的XSLT樣式表,來顯示這個XML文件,並提供一些XML文件的統計信息。css
2.個人架構html
DbfMonitor(程序根目錄) | |-dbfs(目錄) | | | |-dbf1(目錄) | | |-dbf1.dbf | |-dbf2(目錄) | | |-dbf2.dbf | ... | |-xmls(目錄) | | | |-xml1(目錄) | | |-xml1.xml | | |-xml1.xslt | | |-xml1.css(xslt文件調用) | |-xml2(目錄) | | |-xml2.xml | | |-xml2.xslt | | |-xml2.css(xslt文件調用) | ... | |-Dbf2Xml.exe(一個VB.NET程序,將DBF轉換到XML) |-DbfMonitor.bat(單擊這個文件運行程序) |-DbfMonitor.vbs
關於這個程序結構樹的說明以下:java
1)雙擊DbfMonitor.bat文件,啓動這個程序,DbfMonitor.bat會調用文件DbfMonitor.vbsapi
2)DbfMonitor.vbs有兩個功能:其一爲每隔一段時間,將NAS上(或其餘任意Windows文件系統可訪問到的位置)的DBF文件,同步到本地dbfs目錄下;其二爲調用程序Dbf2Xml,把DBF文件的內容寫到指定的XML文件中,保存到xmls目錄下對應的目錄中瀏覽器
3)生成XML文件,會引用與之同名的*.xslt文件做爲樣式表,*.xslt中帶有javascript代碼,保證每隔一段時間XML文件會刷新一次,用來保證查看到的是最新的DBF文件內容,*.xslt文件還會調用同名的css樣式表,用來保證一些界面的美觀安全
3.部分程序代碼網絡
1)DbfMonitor.bat架構
這個文件用來調用DbfMonitor.vbs,代碼以下:工具
@cscript DbfMonitor.vbs @pause
2)DbfMonitor.vbs
下面的程序,以同步一個A.DBF到A.XML爲例:
Option Explicit WScript.Echo "DBF同步顯示工具 2015年2月 Tsybius" WScript.Echo "--------------------------------" Dim FSO : Set FSO = WScript.CreateObject("Scripting.FileSystemObject") Dim WS : Set WS = WScript.CreateObject("WScript.Shell") '這裏設定時間間隔信息 Const Interval = 10000 Dim CurHour Dim CurMinute Dim CurSecond Do '打印時間信息 CurHour = Hour(Now) CurMinute = Minute(Now) CurSecond = Second(Now) WScript.Echo "當前時間: " & CurHour & "時 " & CurMinute & "分 " & CurSecond & "秒" 'A.DBF WScript.Echo "複製文件A.DBF" If FSO.FileExists("P:\A.DBF") Then FSO.CopyFile "P:\A.DBF", "dbfs\dbf_A\A.dbf", True WScript.Echo "A.DBF文件複製完畢: dbfs\dbf_A\A.dbf" WS.Run "Dbf2Xml.exe dbfs\dbf_A\A.dbf xmls\xml_A\A.xml A MS_VFP_Oledb", 0 Else WScript.Echo "未找到A.DBF" End If WScript.Sleep(Interval) Loop
3)Dbf2Xml.exe
這是一個用VB.NET語言寫的DBF轉XML工具
它能夠把DBF轉換成下面形式的XML文件:
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type='text/xsl' href='A.xslt'?> <DATA COUNT="32" INPUT-DBF="A.dbf" OUTPUT-XML="A.xml"> <DATA_ROW> <列1>列1內容</列1> <列2>列2內容</列2> 列三、列4 ... </DATA_ROW> <DATA_ROW> <列1>列1內容</列1> <列2>列2內容</列2> 列三、列4 ... </DATA_ROW> 行三、行4 ... </DATA>
這個程序是在一個另外一個程序的基礎上改寫的:http://www.oschina.net/p/curtia_dbf2xml
共有4個參數,分別是DBF文件地址、轉換後的XML文件地址、針對該XML轉換須要添加的參數(這個參數是在程序中根據實際狀況進行改動的)、鏈接DBF文件使用的鏈接方式(有多種鏈接方式時能夠配置它)
4)關於xslt文件
對於每個XML,都要有一個本身專屬的XSLT文件與之匹配,這樣才能讓XML文件顯示出想要的東西
下面是一個XML文件示例:A.xml
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type='text/xsl' href='A.xslt'?> <DATA COUNT="3" INPUT-DBF="A.dbf" OUTPUT-XML="A.xml"> <DATA_ROW> <COLUMN1>A</COLUMN1> <COLUMN2>1</COLUMN2> <COLUMN3>1</COLUMN3> <COLUMN4>1</COLUMN4> <COLUMN5>1</COLUMN5> <COLUMN6>1</COLUMN6> <COLUMN7>1</COLUMN7> </DATA_ROW> <DATA_ROW> <COLUMN1>B</COLUMN1> <COLUMN2>3</COLUMN2> <COLUMN3>3</COLUMN3> <COLUMN4>3</COLUMN4> <COLUMN5>3</COLUMN5> <COLUMN6>3</COLUMN6> <COLUMN7>3</COLUMN7> </DATA_ROW> <DATA_ROW> <COLUMN1>C</COLUMN1> <COLUMN2>2</COLUMN2> <COLUMN3>2</COLUMN3> <COLUMN4>2</COLUMN4> <COLUMN5>2</COLUMN5> <COLUMN6>2</COLUMN6> <COLUMN7>2</COLUMN7> </DATA_ROW> </DATA>
它對應的XSLT文件的示例爲:A.xslt
<?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head> <meta content="zh-cn" http-equiv="Content-Language"/> <meta content="text/html; charset=utf-16" http-equiv="Content-Type"/> <link type="text/css" rel="stylesheet" href="A.css"/> <title>標題</title> <script type="text/javascript" language="javascript"> <xsl:text disable-output-escaping="yes"> <![CDATA[ function myrefresh() { window.location.reload(); } setTimeout('myrefresh()', 300000); //在這裏指定刷新間隔,單位毫秒 ]]> </xsl:text> </script> </head> <body> <div id="content"> <br /> 數據總計: <strong><font color="red"><xsl:value-of select="DATA/@COUNT" /></font></strong><br /> 輸入文件: <strong><font color="red"><xsl:value-of select="DATA/@INPUT-DBF" /></font></strong><br /> 輸出文件: <strong><font color="red"><xsl:value-of select="DATA/@OUTPUT-XML" /></font></strong><br /> <hr /> <xsl:variable name="A_1" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='1'])"/> <xsl:variable name="A_2" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='2'])"/> <xsl:variable name="A_3" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='3'])"/> <xsl:variable name="A_4" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='4'])"/> <xsl:variable name="A_5" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='5'])"/> <xsl:variable name="B_1" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='1'])"/> <xsl:variable name="B_2" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='2'])"/> <xsl:variable name="B_3" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='3'])"/> <xsl:variable name="B_4" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='4'])"/> <xsl:variable name="B_5" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='5'])"/> <xsl:variable name="C_1" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='1'])"/> <xsl:variable name="C_2" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='2'])"/> <xsl:variable name="C_3" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='3'])"/> <xsl:variable name="C_4" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='4'])"/> <xsl:variable name="C_5" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='5'])"/> 統計信息:<br /> <table> <tr> <th></th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> </tr> <tr> <td>A</td> <td><xsl:value-of select="$A_1"/></td> <td><xsl:value-of select="$A_2"/></td> <td><xsl:value-of select="$A_3"/></td> <td><xsl:value-of select="$A_4"/></td> <td><xsl:value-of select="$A_5"/></td> </tr> <tr> <td>B+C</td> <td><xsl:value-of select="$B_1+$C_1"/></td> <td><xsl:value-of select="$B_2+$C_2"/></td> <td><xsl:value-of select="$B_3+$C_3"/></td> <td><xsl:value-of select="$B_4+$C_4"/></td> <td><xsl:value-of select="$B_5+$C_5"/></td> </tr> </table> <hr /> <table> <tr> <th>列1</th> <th>列2</th> <th>列3</th> <th>列4</th> <th>列5</th> <th>列6</th> <th>列7</th> </tr> <xsl:for-each select="DATA/DATA_ROW"> <tr> <td class="textCentered"><xsl:value-of select="COLUMN1"/></td> <td class="textCentered"><xsl:value-of select="COLUMN2"/></td> <td class="textCentered"><xsl:value-of select="COLUMN3"/></td> <td class="textCentered"><xsl:value-of select="COLUMN4"/></td> <td class="textCentered"><xsl:value-of select="COLUMN5"/></td> <td class="textCentered"><xsl:value-of select="COLUMN6"/></td> <td class="textCentered"><xsl:value-of select="COLUMN7"/></td> </tr> </xsl:for-each> </table> </div> </body> </html> </xsl:template> </xsl:stylesheet>
調用的CSS文件爲:A.css
/* Body style, for the entire document */ body { background: #F3F3F4; color: #1E1E1F; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; padding: 0; margin: 0; } /* Header1 style, used for the main title */ h1 { padding: 10px 0px 10px 10px; font-size: 21pt; background-color: #E2E2E2; border-bottom: 1px #C1C1C2 solid; color: #201F20; margin: 0; font-weight: normal; } /* Table styles */ table { border-spacing: 0 0; border-collapse: collapse; font-size: 10pt; } table th { background: #3399FF; text-align: center; text-decoration: none; font-weight: normal; padding: 3px 6px 3px 6px; width:100px; } table td { vertical-align: top; text-align: center; padding: 3px 6px 5px 5px; margin: 0px; border: 1px solid #E7E7E8; background: #66FF33; } .textCentered { text-align: center; } #content { padding: 0px 12px 40px 40px; }
最終A.xml打開後的效果爲:
4.其餘注意事項
1)IE瀏覽器在加載XML時,會提示「爲了有利於保護安全性,Internet Explorer已限制此網頁運行能夠訪問計算機的腳本或ActiveX控件。請單擊這裏獲取選項...」,在鼠標右鍵彈出的菜單中選擇「容許阻止的內容」,便可調用javascript代碼不斷刷新頁面
2)Windows的文件系統沒法直接經過IP地址獲取NAS上的文件,必需要對網絡驅動器作完映射後才能經過新賦予的盤符訪問NAS上的路徑,方法是在桌面上的計算機圖標上,單擊鼠標右鍵→映射網絡驅動器。若是不進行驅動器映射,在訪問時會報錯,好比在cmd中使用cd命令訪問路徑「\\IP地址\目錄名\」,會提示「CMD不支持將UNC路徑做爲當前目錄」
3)若是不當心直接點擊了*.vbs文件,要關閉它,須要先按下「Ctrl+Alt+Delete」,進入Windows 任務管理器,在進程選項卡中關閉進程wscript.exe
END