2012-05-09 14 views
1

これは私がやっていることよりも良い方法でしょう。 私は比喩的な穴に詰まっています。XPathでネストされたノードを無視するにはどうすればよいですか?

特定のノードの下にいくつかのノードを入れたいと思っています。記載されているcontent_tagsのいずれかが、私は が望むのだ階層の最上部することができ

>>> content_tags = 'h1 h2 h3 h4 h5 h6 p ol ul dl table'.split() 
>>> content_xpath = './/*[%s]' % ' or '.join('self::%s' % i for i in content_tags) 
>>> content_xpath 
'.//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or 
self::h6 or self::p or self::ol or self::ul or self::dl or 
self::table]' 

、と私は同じ 以上にあってもよい他の要素を無視したい:私はこのXPath式で を思いつきましたレベル。残念なことに、が <ul>または<table><table><ol>などの中にある場合があります。 という内部要素が外部と別の結果として得られます。良い方法はありますか? 私が見つけたものの中に入れ子にされている可能性のあるノードを無視するために「カット」を実行しますか?または、私が なんて行方不明だということをやっているより良い方法がありますか?

ここに私が解析しようとしているものの例があります。

<div class="interesting"> 
<img src="ignore-this.jpg"/> 
<h1>I want this.</h1> 
<p>I want this, too.</p> 
<div class="sidebar"> 
<ul> 
<li><p>I only want one copy of this, inside the UL.</p></li> 
<li><p>Ditto.</p></li> 
</ul> 
</div> 
</div> 

ありがとう!

ところで、私は私がしたい正確に何 をすると思う 「がdont-にinclude任意の子孫-または自己」フィルタを、提唱w3.orgメーリングリストのいくつかの記事を見つけましたが、それ 最終仕様には入っていないようです。あなたが唯一の直接興味深いdiv下だpをしたい場合は

:)それはあなたが望むものではない場合は、それをしない、それdiv - !:(//pと同じように検索

答えて

0

は明示的に再帰的です階層内の任意の場所にすることができ、これは、このようなように表現されます:

//div[@class='interesting']/p 

を...あなただけの検索がに相対的である、あなたのツリー内の場所の下に直接ですpをしたい場合、それはさらに簡単です:

./p 
+0

私は本当にこのようなことをしたくなかったが、あなたは私にそれについて話した。ここで、どのように深くネストされていても、不要な要素(たとえば、すべての ''要素)を削除する方法を理解する必要があります。 – samwyse

+0

@ samwyseもしあなたが_remove_ものをできるようにしたいのであれば、おそらくXQUF(XQuery Update Facility)拡張を使ったXQuery実装が適切なツールになるでしょう。 –

関連する問題