如何使用REXML获取不具有特定祖先和后代的标签

时间:2017-02-28 14:41:35

标签: ruby xpath rexml

我想从以下XML获取A标签和B标签,但我想删除第二个A标签:

......many other tags.
<A>abc</A>
<A>   <<==== I want to remove this A tag from result.
  <B>def
    <A>foo</A>
    <A>hoge</A>
    <A>bar</A>
  </B>
 </A>
 .......

我正在使用此XPath:

//*[self::A[not(descendant::B) or self::B]]

然而,这个XPath两次得到B标签的内部A标签:

 <A>abc</A>
   <B>def
      <A>foo</A>
      <A>hoge</A>
      <A>bar</A>
   </B>
   <A>foo</A>
   <A>hoge</A>
   <A>bar</A>

然后,我写了这个Xpath,但它不起作用:

//*[self::A[not(descendant::B or ancestor::B) or self::B]]

我想得到这个结果:

 <A>abc</A>
   <B>def
      <A>foo</A>
      <A>hoge</A>
      <A>bar</A>
   </B>

 .......

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

尝试使用以下XPath表达式:

//*[self::A[not(./B) and not(./parent::B)] or self::B]

输出:

'<A>abc</A>'
'<B>def
    <A>foo</A>
    <A>hoge</A>
    <A>bar</A>
  </B>'

self::A[not(./B) and not(./parent::B)]表示没有直接子级或父级A元素的B