任何人都有这个问题,从html文件解析设置<cfcase>
值的值包含空格?如果值包含空格,ColdFusion无法在解析的html文件中找到数据匹配。
例如:
<CFCASE value="LGT RAIN">
<CFSET application.condition="Lt Rain">
</CFCASE>`
html文件的值为&#34; LGT RAIN&#34;,但由于其被解析的方式,它没有定义城市的条件。有没有像在运行switch语句之前检查条件一样的工作?就像是&#34; LGT RAIN&#34;找到然后将cfset值设置为&#34; LGTRAIN&#34;。
以下是我要解析的示例link。
https://forecast.weather.gov/product.php?site=CAE&issuedby=CAE&product=RWR&format=CI&version=1
<CFSET WeatherData = CFHTTP.FileContent>
代码:
<!--- Check For Condition with Two Word Phrase --------------->
<CFSET condition= #GetToken("#content#",#attributes.citystring# + 1, " ")#>
<br>
<CFSET city = #attributes.citystring#>
<CFIF (condition is "LGT")
or (condition is "HVY")
or (condition is "FRZ")
or (condition is "MIX")
or (condition is "NOT")>
<CFSET condition= (
#GetToken("#content#",#attributes.citystring# + 1, " ")#
& " " &
#GetToken("#content#",#attributes.citystring# + 2, " ")#
)>
<br>
<CFSET Temp = #GetToken("#content#",#attributes.citystring# + 3, " ")#>'
.......
答案 0 :(得分:2)
关于你最终会如何处理你所得到的天气,有很多缺失的背景,所以我做了一些关于解决天气预测的方法的假设。
您必须实际解析页面以获取该实际块,但是一旦您这样做,您可以使用我的建议将这些天气元素拆分出来。我摆脱了getToken()
调用,因为我认为这可能比你需要的工作更多,并且基本上导致了空格问题。我的代码仍然比我想象的要多,但我试图确保我没有使用CF8之上的任何东西。我认为它应该全部工作,但我没有CF8服务器可以测试。
https://trycf.com/gist/1993243eb476a629ec25f8c6e8ddff3c/acf?theme=monokai
我在代码中包含了一些注意事项。
<!--- Create a block of the parsed weather. --->
<cfsavecontent variable="myWX">ANDERSON FAIR 49 16 26 W12G20 30.01F
LIBERTY FAIR 49 14 24 W12G21 29.99F
SPARTANBURG FAIR 45 9 23 NW12G21 30.00F
CLEMSON FAIR 48 10 21 NW13G22 30.02F
GREENVILLE FAIR 48 13 24 VRB3 29.99F
GREENWOOD FAIR 49 13 23 W10G21 30.03F
GREER FAIR 48 9 20 VRB7 29.99F
ROCK HILL FAIR 46 17 31 NW10G22 29.99F
CHESTER FAIR 45 12 26 W12G17 30.01F
LAURENS FAIR 48 16 27 NW12G18 30.01F
</cfsavecontent>
<!--- end of line character (this may change if your feed uses other eol)--->
<cfset crlf = chr(13)&chr(10)>
<!--- Make weather an array of strings for each city. --->
<cfset wxArray = ListToArray(myWX, crlf, false, true)>
我的建议是将不同的元素放在一个结构中,然后使用它。 1排城市天气= 1排结构。
我的代码假定您正在从HTML中解析65个字符的固定宽度记录的行,这是您在获取各个行时的样子。
<!--- Loop through the new weather array and make a new array of parsed weather. --->
<!--- Create initial weather array for output. --->
<cfset newWXArray = []>
<cfloop array="#wxArray#" index="wxRow">
<!--- NOTE: Yay go CF8s implicit struct creation! --->
<cfset WXRow = {
city = trim(mid(wxRow,1,15)) , <!--- trim() will remove leading/trailing spaces --->
sky = trim(mid(wxRow,16,10)) ,
tmp = trim(mid(wxRow,26,4)) ,
dp = trim(mid(wxRow,30,4)) ,
rh = trim(mid(wxRow,34,3)) ,
wind = trim(mid(wxRow,37,10)) ,
pres = trim(mid(wxRow,47,6)) ,
rmks = trim(mid(wxRow,53,11))
}>
<!--- ArrayAppend() returns true/false, so this variable isn't used. --->
<cfset throwaway = ArrayAppend(newWXArray, WXRow)>
</cfloop>
<cfdump var="#newWXArray#">
现在你有一个包含所有城市的阵列,可以为你需要的城市拉出各个部分。
What's the weather like in Liberty? <br>
<cfset whichRow = 0>
<cfloop from="1" to="#arrayLen(newWXArray)#" index="i">
<cfif newWXArray[i].CITY IS "LIBERTY">
<cfset whichRow = i>
</cfif>
</cfloop>
<cfoutput>
City >> #newWXArray[whichRow].CITY# <br>
Sky >> #newWXArray[whichRow].SKY# <br>
Temp >> #newWXArray[whichRow].TMP# <br>
DewPoint >> #newWXArray[whichRow].DP# <br>
Relative Humidity >> #newWXArray[whichRow].RH# <br>
Wind >> #newWXArray[whichRow].WIND# <br>
Pressure >> #newWXArray[whichRow].PRES# <br>
Remarks >> #newWXArray[whichRow].RMKS# <br>
</cfoutput>
最后注意事项:
我忘记了CF8的限制。如果能够升级到当前版本的ACF或Lucee,可以使用很多东西来简化 MUCH 。
此外,正如我所建议的,更改链接以提取纯文本版本(https://forecast.weather.gov/product.php?site=CAE&issuedby=CAE&product=RWR&format=txt&version=1&glossary=1)将显着减少您必须解析的文本量。
答案 1 :(得分:1)
我在文本数据中弄乱条件逻辑的空白区域的经验一直是尾随空格,但原则是相同的。如有疑问,请查看您的数据。这是一个简单的例子:
MyVar = 'Lgt Rain'; // two spaces between the words
if (MyVar == 'Lgt Rain'){ // one space between words
applicable code
}
else {
writeoutput(replace(MyVar, ' ', '-space-', 'all'));
}