关于XPATH如何读取出重复的节点?

时间:2022-04-29 23:42:04
<AAA>
   <BBB>
      <CCC name="abc">
      </CCC>
   </BBB>
   <DDD>
      <CCC name="abc">
      </CCC>
   </DDD>
   <EEE>
      <CCC name="efg">
      </CCC>
   </EEE>
</AAA>
比如这样一个xml,我想获取同一个属性出现两次以上的节点,就是我想获取CCC/@name="abc"这个节点,各位大侠要如何写啊

6 个解决方案

#1


上面的xml有点问题我没有形容清楚,我这边修改了一下
<AAA>
<BBB>
<B1>
<DETAIL name="abc"></DETAIL>
<B1>
<B2>
<DETAIL name="abc"></DETAIL>
<B2>
<B3>
<DETAIL name="efg"></DETAIL>
<B3>
</BBB>
<CCC>
<C1>
<DETAIL name="abc"></DETAIL>
<C1>
<C2>
<DETAIL name="efg"></DETAIL>
<C2>
</CCC>
<DDD>
<D1>
<DETAIL name="hij"></DETAIL>
<D1>
<D2>
<DETAIL name="efg"></DETAIL>
<D2>
</DDD>
</AAA>
需求是这样的,我想获取同一个属性出现两次以上的节点,但是这个重复的跨度只能是BBB,CCC,DDD节点范围内的,不能是BBB跨到CCC下面去找重复,所以只获取<DETAIL name="abc"></DETAIL>这个节点,而<DETAIL name="efg"></DETAIL>不算重复节点。这个xpath要如何写啊,跪求!!!!!

#2


该回复于2014-04-15 17:21:36被管理员删除

#3


还是没看懂问题~~~

#4


xpath只是实现简单的查询,并不能帮你做到统计功能。
所以,你说检查重复,这个“abc”是个固定值呢,还是个未知值。
如果是一个未知值,那就不能依靠xpath实现你的需求。
其实这只要一个简单的算法就能实现了,你可以这样做:
1,通过xpath取出所有节点,语句是://DETAIL
2,遍历DETAIL,并用一个hash table来保存不同的DETAIL。
这个hash table怎么存呢,你可以用DETAIL的父2级节点名+name属性值作为key,然后将重复的数值作为value存入。
例:BBB_abc作为key,值是1。在遍历到第二个BBB下的abc时,值为2,以此类推。
3,hash table中,所有值大于1的就是你要的东西。

#5


http://*.com/questions/4781959/grouping-by-an-attribute-in-xslt

#6


/AAA//DETAIL[@name=abc]

#1


上面的xml有点问题我没有形容清楚,我这边修改了一下
<AAA>
<BBB>
<B1>
<DETAIL name="abc"></DETAIL>
<B1>
<B2>
<DETAIL name="abc"></DETAIL>
<B2>
<B3>
<DETAIL name="efg"></DETAIL>
<B3>
</BBB>
<CCC>
<C1>
<DETAIL name="abc"></DETAIL>
<C1>
<C2>
<DETAIL name="efg"></DETAIL>
<C2>
</CCC>
<DDD>
<D1>
<DETAIL name="hij"></DETAIL>
<D1>
<D2>
<DETAIL name="efg"></DETAIL>
<D2>
</DDD>
</AAA>
需求是这样的,我想获取同一个属性出现两次以上的节点,但是这个重复的跨度只能是BBB,CCC,DDD节点范围内的,不能是BBB跨到CCC下面去找重复,所以只获取<DETAIL name="abc"></DETAIL>这个节点,而<DETAIL name="efg"></DETAIL>不算重复节点。这个xpath要如何写啊,跪求!!!!!

#2


该回复于2014-04-15 17:21:36被管理员删除

#3


还是没看懂问题~~~

#4


xpath只是实现简单的查询,并不能帮你做到统计功能。
所以,你说检查重复,这个“abc”是个固定值呢,还是个未知值。
如果是一个未知值,那就不能依靠xpath实现你的需求。
其实这只要一个简单的算法就能实现了,你可以这样做:
1,通过xpath取出所有节点,语句是://DETAIL
2,遍历DETAIL,并用一个hash table来保存不同的DETAIL。
这个hash table怎么存呢,你可以用DETAIL的父2级节点名+name属性值作为key,然后将重复的数值作为value存入。
例:BBB_abc作为key,值是1。在遍历到第二个BBB下的abc时,值为2,以此类推。
3,hash table中,所有值大于1的就是你要的东西。

#5


http://*.com/questions/4781959/grouping-by-an-attribute-in-xslt

#6


/AAA//DETAIL[@name=abc]