REXML

2017-02-28 8 views
1

を使用して、特定の祖先と子孫を持たないタグを取得するにはどうすれば、次のXMLからのタグとBタグを取得したいのですが、私は第二のタグを削除する:REXML

......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>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> 

....... 

は、どのように私はこの問題を解決することができますか?

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

出力:XPath表現の下に使用する

+0

を持っていない私は[鋸山]を使用してお勧めしますAを意味し、 (http://www.nokogiri.org)をREXML上で公開しています。 REXMLにはRubyが付属していますが、Nokogiriは高速でデファクトスタンダードです。また、XPathに加えてCSSセレクタの使用をサポートしているため、特定のルックアップに適したものを選択できます。 –

答えて

0

てみ

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

self::A[not(./B) and not(./parent::B)]には直接の子や親B要素

関連する問題