2014-09-04 75 views
2

我正在嘗試編寫一個簡單的VBScript,查看XML文件,提取兩個屬性,將它們添加到結果並將結果輸出到輸出文件。到目前爲止,我已經能夠使用加載XML輸入文件:從XML節點分配變量的VBScript

Option Explicit 
Set objDoc = CreateObject("MSXML.DOMDocument") 
objDoc.Load "C:\_STATS_SCRIPTS\STATS_HOME.xml" 

然後我創建和初始化變量是這樣的:

Dim fumlost 
Dim intercept 
Dim turnovers 
fumlost="0" 
intercept="0" 
turnovers="0" 

這裏是我的XML是什麼樣子(總計子樹後,被截斷):

<fbgame source="Tas Football" version="4.16.01" generated="9/3/2014"> 
    <venue gameid="01UA-WVU" visid="WVU" homeid="UA" visname="West Virginia" homename="Alabama" date="8/30/2014" location="Atlanta, Georgia" stadium="Georgia Dome" start="3:36" end="7:05" neutralgame="Y" duration="3:29" attend="70502" temp="" wind="" weather="Indoor"> 
     <officials ref="David Epperly" ump="Mike Webster" line="Steve Clein" lj="Rod Pearson" bj="Pat Ryan" fj="Mike Culler" sj="Eddie Bonet"></officials> 
     <notes> 
      <note text="Replay: Dan Post"></note> 
     </notes> 
     <rules qtrs="4" mins="15" downs="4" yds="10" kospot="35" tbspot="20" kotbspot="25" patspot="3" safspot="20" td="6" fg="3" pat="1" patx="2" saf="2" defpat="2" rouge="1" field="100" toh="3" sackrush="Y" fgaplay="Y" netpunttb="Y"></rules> 
    </venue> 
    <team vh="H" code="8" id="UA" name="Alabama" record="1-0" abb="A"> 
     <linescore prds="4" line="3,17,10,3" score="33"> 
      <lineprd prd="1" score="3"></lineprd> 
      <lineprd prd="2" score="17"></lineprd> 
      <lineprd prd="3" score="10"></lineprd> 
      <lineprd prd="4" score="3"></lineprd> 
     </linescore> 
     <totals totoff_plays="82" totoff_yards="538" totoff_avg="6.6"> 
      <firstdowns no="30" rush="13" pass="14" penalty="3"></firstdowns> 
      <penalties no="7" yds="49"></penalties> 
      <conversions thirdconv="9" thirdatt="15" fourthconv="0" fourthatt="1"></conversions> 
      <fumbles no="0" lost="0"></fumbles> 
      <misc yds="0" top="37:47" ona="0" onm="0" ptsto="0"></misc> 
      <redzone att="4" scores="4" points="24" tdrush="3" tdpass="0" fgmade="1" endfga="0" enddowns="0" endint="0" endfumb="0" endhalf="0" endgame="0"></redzone> 
      <rush att="49" yds="288" gain="294" loss="6" td="3" long="26"></rush> 
      <pass comp="24" att="33" int="1" yds="250" td="0" long="38" sacks="0" sackyds="0"></pass> 
      <rcv no="24" yds="250" td="0" long="38"></rcv> 
      <punt no="2" yds="101" long="62" blkd="0" tb="0" fc="1" plus50="1" inside20="1" avg="50.5"></punt> 
      <ko no="7" yds="453" ob="0" tb="3"></ko> 
      <fg made="4" att="4" long="47" blkd="0"></fg> 
      <pat kickatt="3" kickmade="3"></pat> 
      <defense tackua="34" tacka="38" tot_tack="72" tflua="6" tfla="0" tflyds="30" sacks="3" sackyds="25" brup="3"></defense> 
      <kr no="4" yds="99" td="0" long="26"></kr> 
      <pr no="1" yds="-1" td="0" long="0"></pr> 
      <scoring td="3" fg="4" patkick="3"></scoring> 
     </totals> 

我下一步需要做的是分配/ fbgame /團隊/總計/摸索@輸給我摸索變量,分配/ fbgame /團隊/總計/通過@ INT到我的攔截變量,然後添加兩個t一起製作失誤,然後輸出。我想我可以處理變量的總結和輸出文件,但是我不知道如何獲取分配給我的變量的XML屬性。早些時候,我成功地創建了一個腳本,它使用sXPath將我的主要輸入文件中的訪問團隊和主隊分開,但我目前無法使用我在那裏學到的知識來完成此任務!

我非常感謝任何幫助,因爲我是一個n00b scripter,在我的頭上!

回答

1

不知道有關在VBScript中使用XPath,但下面的XPath爲我工作:

string(//fbgame/team/totals/fumbles/@lost) 

結果:0

string(//fbgame/team/totals/pass/@int) 

結果:1

也許這種方式更適合你的方法或你可以進一步調整它。

在情況下,你需要整個節點而不僅僅是值,下面的XPath

//fbgame/team/totals/fumbles[@lost] 

結果

<fumbles no="0" lost="0" /> 

爲了提供完整 - 根據查詢,//fbgame可能是/fbgame 。我只是調整了你的XML部分來解析,並讓XPath匹配每個fbgame(因爲這個例子只包含一個遊戲)。

如果問題不是關於XPath表達式,而是關於如何在VBScript中獲取XPath值,這應該做到這一點(至少獲取值,猜測您將在後面的數學中存儲值的變量):

For Each a In objDoc.selectNodes ("//fbgame/team/totals/fumbles/@lost") 
Wscript.Echo a.text 
Next 

For Each b In objDoc.selectNodes ("//fbgame/team/totals/pass/@int") 
Wscript.Echo b.text 
Next 
+0

不介意格式化,我猜得到它;)prob是判斷結果而不知道XML,但不會CInt(a)爲字符串值01格式到整數1 ..?希望這不是誤解,只是認爲現在是問題所在。或者你可以加起來的結果? – 2014-09-04 20:10:54

+0

我無法添加這兩個變量。我認爲這只是把他們放在一起,當我做「營業額=攔截+ fumlost」 – 2014-09-04 20:16:31

0

下面的代碼正確拉動值,但是當總結'失誤'時,返回的輸出是「01」而不是「1」。它是否正確??

Set colNodes=xmlDoc.selectNodes ("//fbgame/team/totals/pass/@int") 

For Each objNode in colNodes 
    intercept = objNode.text 
    Wscript.Echo intercept 
Next 

Set colNodes=xmlDoc.selectNodes ("//fbgame/team/totals/fumbles/@lost") 

For Each objNode in colNodes 
    fumlost = objNode.text 
    Wscript.Echo fumlost 
Next 

turnovers = fumlost + intercept 

Wscript.Echo turnovers 
+0

如果我不得不猜測,我會說我需要將變量轉換爲整數。我現在正在尋找如何做到這一點...... – 2014-09-04 20:11:16

+0

只是看看我最近的評論,也許就是這樣(如果是CInt() – 2014-09-04 20:11:41

+0

接下來的事情是 - 在這裏猜測:你已經有兩個變量;剛剛找到除此之外,你必須設置第三個,比如:Dim Var3 - 然後Var3 = Var1 + Var2用於在Var3中獲得結果;也許你只需先遮擋攔截+ fumlost?例如:http:/ /www.tutorialspoint.com/vbscript/vbscript_variables.htm – 2014-09-04 20:22:08

0

感謝您的幫助!不能沒有stackoverflow做到這一點!最終的工作代碼:

Set xmlDoc = CreateObject("Microsoft.XMLDOM") 

xmlDoc.Async = "False" 
xmlDoc.Load("STATS_HOME.xml") 


Dim fumlost 
Dim intercept 
Dim turnovers 
fumlost="0" 
intercept="0" 
turnovers="0" 

Set colNodes=xmlDoc.selectNodes ("//fbgame/team/totals/pass/@int") 

For Each objNode in colNodes 
    intercept = objNode.text 
Next 

Set colNodes=xmlDoc.selectNodes ("//fbgame/team/totals/fumbles/@lost") 

For Each objNode in colNodes 
    fumlost = objNode.text 
Next 
turnovers = CInt(fumlost) + CInt(intercept) 

Dim fso 
Set fso = WScript.CreateObject("Scripting.Filesystemobject") 
Set f = fso.OpenTextFile("C:\_STATS_SCRIPTS\TO_HOME.txt", 2) 
f.Writeline turnovers