gpt4 book ai didi

xpath - 需要使用 sibling 、祖先的复杂 Xpath

转载 作者:行者123 更新时间:2023-12-03 15:55:43 25 4
gpt4 key购买 nike

我需要根据从 parent /祖 parent 的 sibling 的 child 那里提取的其他值来查找属性值。我认为它需要 2 个不同的表达式。

因此给定以下 XML(源自可能有数千行长的日志文件):

<p:log xmlns:p="urn:NamespaceInfo">
<p:entries>
<p:entry timestamp="2012-12-31T09:39:25">
<p:attributes>
<p:attrib name="Position" value="1B2" />
<p:attrib name="Something" value="Something_else" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:attributes>
<p:attrib name="Form" value="FormA" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Successful....</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T12:12:12">
<p:attributes>
<p:attrib name="Position" value="1B3" />
<p:attrib name="Something" value="Something_else" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:attributes>
<p:attrib name="Form" value="FormB" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Processing....</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Error1</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Error1</p:msg>
</p:entry>
</p:entries>
...
</p:log>
  • ( <p:attributes> 父标签可以有多个 <p:attrib> 子标签)
  • (<p:event> 标签只能有一个<p:msg> 标签)

首先,我需要获取 value 的值具有相应 name 的属性Position 的属性, 但前提是祖 parent 的 sibling p:entry有 child p:msg正文为 Error1 .此外,它需要留在该部分内。例如,我不想第一次出现 Position'/'Value对因为一个新的 Position/Value对出现在 Error1 之前,即使从技术上讲是 p:msgError1是祖 parent 的 sibling 。

接下来,我需要 Position 的子项的父项的时间戳属性值/Value我刚刚捕获了。所以,找到位置,然后找到祖 parent 的时间戳属性值p:entry标签。

所以对于这个例子,我应该只能检索以下值:

1B3

2012-12-31T12:12:12 (给定的日期/时间戳是任意值。这个是不同的,所以你知道我指的是哪一个)。

我知道有点困惑。我还需要确保只获取一个实例,因为我正在使用 XQuery 从数据库中获取数据,并且每个表达式都必须生成一个奇异值。

我可以获得与 p:msg 关联的第一个时间戳与 Error1具有以下内容://p:entry[descendant::p:msg='Error1.'][1]/@timestamp

但似乎无法回到树上获取其他值。

我可以获得具有 p:attrib 孙子代的 p:events 的所有时间戳://p:entry[descendant::p:attrib[@name=''Position'']]/@timestamp)[1]

但我似乎无法将其限制为仅跟随其后的“Error1”。我不能根据职位选择。我必须首先基于内容。

奖励问题

我怎样才能在日志文件中的下一个实例中再次执行此操作?(不只是第二条 Error1 消息,下一次在日志文件中显示 Error1 消息用于下一次“父/兄弟”匹配)。一旦我得到上述问题的答案,这可能是显而易见的。

最佳答案

更新:

好的,我想我明白了。这是第一个问题的答案:

//p:msg[text()="Error1"]/../preceding-sibling::p:entry[./*/p:attrib[@name="Position"]][1]/*/p:attrib[@name="Position"]/@value

这是从 p:msg 开始工作的标记,这样可以更轻松地选择前一个父级 [1] 的第一个(即其中的 p:entry)满足有孙子条件的标签p:attrib有一个名字 Position .

获取时间戳稍微简单一点:

//p:msg[text()="Error1"]/../preceding-sibling::p:entry[./*/p:attrib[@name="Position"]][1]/@timestamp

尝试一下,看看您的想法。

原始答案:

通常我不会发布半成品的答案,但我猜你不会得到任何其他答案,因为这个问题太复杂了,所以这里是你在第一段中描述的内容的 xpath:

//p:entry[following-sibling::p:entry/p:msg/text()="Error1"]/*/p:attrib[@name="Position"]/@value

这会得到

the value of the value attribute that has a corresponding name attribute of Position, but only if the grand-parent's sibling p:entry has a child p:msg with the text of Error1.

但是,当您说“它需要留在该部分内”时,我不明白您的意思。你能澄清一下吗?这将同时返回 1B21B3 .

对于问题的第二部分,您可以通过以下方式获取上述条目的时间戳:

//p:entry[following-sibling::p:entry/p:msg/text()="Error1" and ./*/p:attrib[@name="Position"]]/@timestamp

同样,这不会执行您提到的“部分”操作。不幸的是,这超出了我(当前)对 xpath 的了解。

关于xpath - 需要使用 sibling 、祖先的复杂 Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589059/

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