<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表达式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)