如何获取某个元素的索引?

时间:2019-07-17 18:18:26

标签: xml xpath count

<documentRoot>
    <!-- Test data --> 
    <?value="2"?> 
    <parent name="data" > 
        <child id="1"  name="alpha" >Some Text</child> 
        <child id="2"  name="beta" > 
            <grandchild id="2.1"  name="beta-alpha" ></grandchild> 
          <grandchild id="2.2"  name="beta-beta" ></grandchild> 
        </child> 
        <pet name="tigger"  type="cat" > 
            <data> 
                <birthday month="sept"  day="19" ></birthday> 
                <food name="Acme Cat Food" ></food> 
            </data> 
        </pet> 
        <pet name="Fido"  type="dog" > 
            <description> 
                Large dog! 
            </description> 
            <data> 
                <birthday month="feb"  day="3" ></birthday> 
                <food name="Acme Dog Food" ></food> 
            </data> 
        </pet> 
    </parent> 
</documentRoot>

我想获取文档中所有相同元素的元素中某个单词的索引。在这种情况下,我想为“ Acme Dog Food”获得索引2或为“ Acme Cat Food”获得1。我尝试过:

count(//../food[contains(text(), 'Dog')]/preceding::food)

但是我得到一个索引0。 我在这里尝试过:http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

3 个答案:

答案 0 :(得分:0)

代码contains(text(), 'Dog')会在其中查找包含“ Dog”(即<element>Dog</element>的元素的元素。相反,您正在寻找包含“ dog”的属性“ name”,因此解决方案是:

count(//../food[contains(@name, 'Dog')]/preceding::food)

请注意,这将获得之前的元素数量,但不会获得正确的索引。 XPath中的索引从1开始,而不是0。要解决此问题,只需添加+1

答案 1 :(得分:0)

如果向上走两步,您可以算出前面的兄弟姐妹。

1+count(//food[@name="Acme Dog Food"]/../../preceding-sibling::pet)

表达式的问题在于Dog是属性值的一部分,而不是text()节点。

答案 2 :(得分:0)

尝试使用此XPath-1.0表达式

public static Expression<Func<T1, bool>> Compose<T1, T2>(this Expression<Func<T1, T2>> convertExpr, Expression<Func<T2, bool>> predicate)
    => Expression.Lambda<Func<T1, bool>>(predicate.Apply(convertExpr.Body), convertExpr.Parameters.First());

count(/documentRoot/parent/pet[data/food/@name = 'Acme Dog Food']/preceding-sibling::pet) + 1