gpt4 book ai didi

c# - 具有多个祖先条件的 XPath 表达式

转载 作者:数据小太阳 更新时间:2023-10-29 02:21:18 24 4
gpt4 key购买 nike

我正在开发的应用程序接收到类似于以下的 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>

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

  1. child 有效祖先的n代后代。
  2. Child 可能是 Container 祖先的 m 代后代,它是 Valid 的 o 代后代 祖先。
  3. 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 属性等于 Child1Child2Child 元素>、Child3Child4

我最接近的解决方案是下面的表达式。

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

但是,这将选择 Child 元素,其 name 属性等于 Child19Child20

对于 ChildValid 元素之间的所有祖先,XPath 语法是否支持元素的可选出现或设置类似于前面示例中的 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]
]

意味着:

从文档中的所有 Child 元素中,仅选择那些不是 Container 的第一个祖先是 Valid 的元素。

关于c# - 具有多个祖先条件的 XPath 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4980924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com