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代后代. 其中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的第一个祖先有效的元素. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |