如何在 VB6 中将连接字符串评估为索引 XPath 表达式
Posted
技术标签:
【中文标题】如何在 VB6 中将连接字符串评估为索引 XPath 表达式【英文标题】:How evaluate concatenated string as indexed XPath expression in VB6 【发布时间】:2019-10-27 04:10:55 【问题描述】:我在 VB6 中通过连接字符串构建了一个 Xpath 表达式:
strXPath = "xDOC.selectNodes(" & """/GroupType1""" & ").item(" & CStr(i) & ").selectNodes(" & """/OperationStageCollection/OperationStage""" & ").length"
“i”是用于索引的整数
我想评估 strXPath 以获得循环计数器,例如:
n = CInt(strXPath)
n 被声明为整数; strXPath 被声明为字符串。 VB6 对上述求值表达式抛出类型不匹配错误。我一定遗漏了一些明显的东西。如何评估 strXPath?
我意识到 XPath 表达式本身可能存在错误,但我想让评估工作以调试此类可能的错误。
【问题讨论】:
“我在 VB6 中通过连接字符串构建了一个 XPath 表达式:” - 不,您已经通过连接字符串构建了 VB6 代码。这行不通,而且你真的不想评估它。 显示您的 XML 并描述您想要实现的目标,而不是仅仅描述如何您想要实现您自己没有解释的目标。 你说得对——我用串联字符串方法把自己引向了一个死胡同。在阅读了另一篇我现在无法快速找到的帖子后,我采用了这种方法,但无论如何我可能误解了它。在下面对@Hel 的评论中,我指出了似乎可行的方法。 FWIW、xDOC.selectNodes("/GroupType1").item(i).selectNodes("/OperationStageCollection/OperationStage").Length
和 xDOC.selectNodes("/GroupType1[" & (i+1) & "]/OperationStageCollection/OperationStage").Length
应该相同(XPath 从 1 开始计数,VB 从 0 开始计数,因此是 +1
)
注明。谢谢你。我正在逐渐弄清楚这一点......
【参考方案1】:
尝试删除一些双引号:
iLength = xDOC.selectNodes("/GroupType1").item(i).selectNodes("/OperationStageCollection/OperationStage").length
这应该以整数形式返回您想要的 length
属性。
然后你可以在你的循环中使用iLength
。
【讨论】:
谢谢艾蒂安。这正是我在决定尝试串联字符串方法之前所做的。我想知道是否实际上正在评估索引值,因为无论我如何调整表达式,XPath 表达式都返回 0。现在我想知道在 1 个表达式中有 2 个 selectNodes 是否可以。编译器接受它,但我得到 0 个节点。你可以在我的相关帖子here中看到我的xml。 我已将此标记为答案,因为您让我回到了正确的轨道上。在下面对@Hel 的评论中,我指出了似乎可行的小改动。再次感谢。 谢谢,非常感谢! XPath 故障排除可能很乏味,但您增加了额外的复杂性!祝你项目的其余部分好运【参考方案2】:@BRW:您的两个问题都非常具体,即如何 使用 XPath 实现某些结果。但我怀疑如果您解释 what(数据)您尝试从 XML 中检索,评论者可能会向您展示您没有想到的方式,例如假设您想遍历<OperationEventCollection>
中的所有<OperationEvent>
s,//GroupType1/OperationStageCollection/OperationStage/OperationEventCollection/OperationEvent[1-based-index]
可以检索单个<OperationEvent>
,例如//GroupType1/OperationStageCollection/OperationStage/OperationEventCollection/OperationEvent[1]
,生成单个 XML 节点:
<OperationEvent>
<OperationEventDate1>2018-12-16</OperationEventDate1>
<OperationEventCode>5</OperationEventCode>
<OperationEventDate2>2018-05-16</OperationEventDate2>
</OperationEvent>
因此,使用多个 selectNodes
方法,一个正确的 XPath 查询可能会立即产生所需的结果。
【讨论】:
谢谢赫尔。我想我已经想通了。xDOC.selectNodes("/GroupType1").item(i).selectNodes(".//OperationStageCollection/OperationStage").length
给了我正确的结果。我需要做的是处理相对于索引节点的子节点,.//
似乎让我明白了。以上是关于如何在 VB6 中将连接字符串评估为索引 XPath 表达式的主要内容,如果未能解决你的问题,请参考以下文章
如何在swift中将字符索引从layoutManager转换为String scale
VB6 中的 Winsock 控件只向数组中的最后一个索引发送文本消息
在 VB6 中将 DAO DBEngine DataTable 的列从 DataType dbInteger 更改为 dbLong