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

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

概述我正在开发的应用程序收到类似于以下的 XML结构: <Root> <Valid> <Child name="Child1" /> <Container> <Child name="Child2" /> </Container> <Container> <Container> 我正在开发的应用程序收到类似于以下的 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/ChildValID/Container/ChildValID/Container/Container/ChildValID/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的第一个祖先有效的元素.

总结

以上是内存溢出为你收集整理的c# – 在多个祖先上具有条件的XPath表达式全部内容,希望文章能够帮你解决c# – 在多个祖先上具有条件的XPath表达式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1216551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存