加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在多个祖先上具有条件的XPath表达式

发布时间:2020-12-16 01:41:13 所属栏目:百科 来源:网络整理
导读:我正在开发的应用程序收到类似于以下的 XML结构: Root Valid Child name="Child1" / Container Child name="Child2" / /Container Container Container Child name="Child3"/ Child name="Child4"/ /Container /Container Wrapper Child name="Child5" / /W
我正在开发的应用程序收到类似于以下的 XML结构:

<Root>
    <Valid>
        <Child name="Child1" />
        <Container>
            <Child name="Child2" />
        </Container>
        <Container>
            <Container>
                <Child name="Child3"/>
                <Child name="Child4"/>
            </Container>
        </Container>
        <Wrapper>
            <Child name="Child5" />
        </Wrapper>
        <Wrapper>
            <Container>
                <Child name="Child19" />
            </Container>
        </Wrapper>
        <Container>
            <Wrapper>
                <Child name="Child6" />
            </Wrapper>
        </Container>
        <Container>
            <Wrapper>
                <Container>
                    <Child name="Child20" />
                </Container>
            </Wrapper>
        </Container>
    </Valid>
    <Invalid>
        <Child name="Child7" />
        <Container>
            <Child name="Child8" />
        </Container>
        <Container>
            <Container>
                <Child name="Child9"/>
                <Child name="Child10"/>
            </Container>
        </Container>
        <Wrapper>
            <Child name="Child11" />
        </Wrapper>
        <Container>
            <Wrapper>
                <Child name="Child12" />
            </Wrapper>
        </Container>
    </Invalid>
</Root>

我需要在以下条件下获取Child元素的列表:

> Child是有效祖先的n代后代.
> Child可能是Container祖先的m代后代,它是有效祖先的o代后代.
> Child元素的有效祖先是作为m代祖先的Container元素和作为第一代祖先的Valid元素.

其中m,n,o是自然数.

我需要编写以下XPath表达式

Valid/Child
Valid/Container/Child
Valid/Container/Container/Child
Valid/Container/Container/Container/Child
...

作为单个XPath表达式.

对于提供的示例,XPath表达式将仅返回name属性等于Child1,Child2,Child3和Child4的Child元素.

我最接近解决方案是遵循表达式.

Valid/Child | Valid//*[self::Container]/Child

但是,这将选择名称属性等于Child19和Child20的Child元素.

XPath语法是否支持元素的可选出现或者在前面的示例中为self和Valid元素之间的所有祖先设置类似于self的条件?

解决方法

使用:

//Child[ancestor::*
          [not(self::Container)][1]
                            [self::Valid]
       ]

在提供的XML文档上评估此XPath表达式时:

<Root>
    <Valid>
        <Child name="Child1" />
        <Container>
            <Child name="Child2" />
        </Container>
        <Container>
            <Container>
                <Child name="Child3"/>
                <Child name="Child4"/>
            </Container>
        </Container>
        <Wrapper>
            <Child name="Child5" />
        </Wrapper>
        <Wrapper>
            <Container>
                <Child name="Child19" />
            </Container>
        </Wrapper>
        <Container>
            <Wrapper>
                <Child name="Child6" />
            </Wrapper>
        </Container>
        <Container>
            <Wrapper>
                <Container>
                    <Child name="Child20" />
                </Container>
            </Wrapper>
        </Container>
    </Valid>
    <Invalid>
        <Child name="Child7" />
        <Container>
            <Child name="Child8" />
        </Container>
        <Container>
            <Container>
                <Child name="Child9"/>
                <Child name="Child10"/>
            </Container>
        </Container>
        <Wrapper>
            <Child name="Child11" />
        </Wrapper>
        <Container>
            <Wrapper>
                <Child name="Child12" />
            </Wrapper>
        </Container>
    </Invalid>
</Root>

确切地选择了所需的节点:

<Child name="Child1"/>
<Child name="Child2"/>
<Child name="Child3"/>
<Child name="Child4"/>

说明:

表达方式:

//Child[ancestor::*
          [not(self::Container)][1]
                            [self::Valid]
       ]

手段:

从文档中的所有子元素中,仅选择那些不是Container的第一个祖先有效的元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读