cha*_*kun 2 coldfusion struct key exists
假设我刚刚解析了其他人的XML文档,这是对API请求的响应.我想知道嵌套在内部的值是否存在.如果我的API请求有效,则每次都会在同一个地方.如果我的API请求失败,则XML的根目录非常不同.
如果我尝试<cfif structKeyExists(myStruct.level1.level2.level3, 'myTarget')>失败的api请求,我会得到致命的错误:Element LEVEL1.LEVEL2 is undefined in MYSTRUCT.
当然,我可以尝试依赖XML的根级别告诉我成功或失败,如果失败则不会查找结果,但是......除非解决方案,我该怎么办?
我是否需要检查结构的每个级别是否存在?如:
<cfif structKeyExists(myStruct, 'level1')
and structKeyExists(myStruct.level1, 'level2')
and structKeyExists(myStruct.level1.level2, 'level3')
and structKeyExists(myStruct.level1.level2.level3, 'myTarget')>
<!--- ... --->
</cfif>
Run Code Online (Sandbox Code Playgroud)
这不是一个现实世界的问题,这只是我面对的事情太多次了.请不要告诉我涉及更改API或第3段中的解决方案的解决方案.
谢谢!
编辑:我应该已经提到为什么我不能使用isDefined() - 一些键没有语法上有效的名称,所以isDefined()抛出一个错误,例如myStruct.level1 [42] .level3
我会使用解析的XML文档(即xmlDoc)和XMLSearch:
<cfset xmlDoc = xmlParse(responseData)>
<cfset nodes = XmlSearch(xmlDoc, '/level1/level2/level3/myTarget')>
<cfif arrayLen(nodes)>
<!--- do something, you have the "nodes" array to work with too --->
</cfif>
Run Code Online (Sandbox Code Playgroud)
xpath用于XMLSearch()假设结构键是节点.例如,如果"myTarget"是节点的属性,则需要相应地进行修改.
另一种方法是StructFindKey.
<cfset result = structFindKey(myStruct, "myTarget")>
<cfif arrayLen(result) AND result.path EQ "level1.level2.level3">
<!--- do something --->
</cfif>
Run Code Online (Sandbox Code Playgroud)
尚未测试,但我相信要么比使用IsDefined()或尝试捕获块更快.具有XMLValidate()不需要DTD 的优点.而且,即使使用DTD,您想要的节点也可以定义为可选节点,因此它仍然可以进行验证.
| 归档时间: |
|
| 查看次数: |
2777 次 |
| 最近记录: |