【问题标题】:XPATH: how get .length of 1st element group and .length of 2nd element group inside 1st group?XPATH:如何获得第一个元素组的 .length 和第一个组内的第二个元素组的 .length?
【发布时间】:2019-10-23 20:21:02
【问题描述】:

我正在处理具有以下结构的 xml 文件。

<GroupType1><GroupType2>需要分开处理。

无论哪种情况,我都想使用 XPATH 遍历每个 <OperationStage> 中的 <OperationEvent> 元素。

所以,对于每个<GroupType1>,我需要在<OperationStageCollection>中获取<OperationStage>的数量,然后在当前<OperationStage><OperationEventCollection>中获取<OperationEvent>的数量。

在伪代码中,处理将是:

    For i = 1 to number of <OperationStageCode> in current <OperationStage> of current <GroupType1>
        For j = 1 to number of <OperationEvent> in ith <OperationStage> in the current <GroupType1>
            process jth <OperationEvent> of ith <OperationStage>
        Next J
    Next i

然后我会为&lt;GroupType2&gt;做同样的事情

我一直在尝试获取&lt;OperationStageCollection&gt; 中的&lt;OperationStage&gt; 的数量,以及当前&lt;OperationStage&gt;&lt;OperationEventCollection&gt; 中的&lt;OperationEvent&gt; 的数量。

我尝试过各种表达方式,比如:

i = xDOC.selectNodes("//OperationStage").length

当然,这只是得到整个&lt;GroupCollection&gt;&lt;OperationStage&gt; 的总数。我尝试过的其他表达式(如下)都返回零。正如你所看到的,我只是在这里胡闹——暴露了我对 XPATH 遍历语法的不熟悉。

i = xDOC.selectNodes("/OperationStage").length
i = xDOC.selectNodes("OperationStageCollection//catmk:ProceedingStage").length
i = xDOC.selectNodes("OperationStageCollection/catmk:ProceedingStage").length
i = xDOC.selectNodes("/OperationStageCollection/catmk:ProceedingStage").length

获取单个&lt;GroupType1&gt;&lt;OperationStageCollection&gt;&lt;OperationStage&gt;的数量,然后获取当前&lt;OperationStage&gt;&lt;OperationEventCollection&gt;&lt;OperationEvent&gt;的数量的正确语法是什么?

我查看了很多 XPATH 文档,但在我的情况下,我没有找到任何有用的示例。如果你知道的话,也请给我指出这些文件。

这是 xml 结构:

<GroupCollection>
    <Groups>
        <GroupType1>
            <GroupType1_Identifier>1</GroupType1_Identifier>
            <OperationStageCollection>
                <OperationStage>
                     <OperationStageCode>3</OperationStageCode>
                        <OperationEventCollection>
                            <OperationEvent>
                                <OperationEventDate1>2018-12-16</OperationEventDate1>
                                <OperationEventCode>5</OperationEventCode>
                                <OperationEventDate2>2018-05-16</OperationEventDate2>
                            </OperationEvent>
                            ... more OperationEvents ...
                        </OperationEventCollection>
                </OperationStage>
                ... more OperationStages ...
            </OperationStageCollection>
        </GroupType1>
        ...moreGroupType1...
         <GroupType2>
            <GroupType2_Identifier>3</GroupType2_Identifier>
            <OperationStageCollection>
                <OperationStage>
                    <OperationStageCode>101</OperationStageCode>
                        <OperationEventCollection>
                            <OperationEvent>
                                <OperationEventCode>6</OperationEventCode>
                                <OperationEventDate2>2012-01-03</OperationEventDate2>
                            </OperationEvent>
                            ... more OperationEvents ...
                        </OperationEventCollection>
                </OperationStage>
                ... more OperationStages ...
            </OperationStageCollection>
        </GroupType2>
        ...moreGroupType2...
    </Groups>
</GroupCollection>

【问题讨论】:

    标签: xml xpath xml-parsing traversal


    【解决方案1】:

    我相信严格意义上的 xpath 表达式

    //GroupType1/OperationStageCollection/count(OperationStage)
    

    应该让你得到单个&lt;GroupType1&gt;&lt;OperationStageCollection&gt;&lt;OperationStage&gt;s 的数量和

    //GroupType1/OperationStageCollection/OperationStage//OperationEventCollection/count(OperationEvent)
    

    应该让您知道当前&lt;OperationStage&gt;&lt;OperationEventCollection&gt;&lt;OperationEvent&gt;s 的数量。

    【讨论】:

    • 杰克:谢谢。第一部分有效,但第二部分给了我整个&lt;OperationEvent&gt;s 的数量&lt;OperationStageCollection&gt;;不仅仅是当前&lt;OperationStage&gt;&lt;OperationEventCollection&gt;&lt;OperationEvent&gt;s 的数量。我会继续摆弄它,看看我是否可以让它工作,但如果你能在此期间提出一个调整建议,我会很感激的。我仍然没有完全掌握语法。我认为“//”捕获了整个 xml 文档中的每个指定元素,但我认为这是错误的,因为您在元素字符串的中间使用了“//”。
    • @BRW - 这一定是你的实现中的一些东西。我在不同的在线 xpath 测试器中再次尝试,输出始终是当前&lt;OperationEventCollection&gt; 中的数字。
    • Jack:一个小麻烦是我必须在 VB6 中编写我的实现,这似乎不支持 count() 方法。所以,我替换了 .length,因此:
    • xDOC.selectNode("//GroupType1/OperationStageCollection/OperationStage//OperationEventCollection/OperationEvent").length
    • @BRW - 只要你到达你想去的地方,一切都很好!
    猜你喜欢
    • 2022-11-16
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多