2009-07-29 14 views
0

よく整形されたxhtml文書を解析しようとしています。
ノードの繰り返し中に問題が発生しています。
私のXHTMLは、私は必要な情報が列(TD)に含まれているJavaとxpath - xHtml解析の問題

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
    <head>...</head> 
    <body> 
    ... 
    <form> 
    ... 
     <div class="AB"> (1 or 2 times) 
     ...      
     <div class="CD"> 
     ... 
      <table>   
      <tbody> 
       <tr> (1 to N times) 
        <td> XXX </td> 
         <td> YYY </td> ... 

のような構造を有しています。
N個のオブジェクトを構築したいと思います。したがって、すべての行(tr)には、オブジェクトを構築するために必要な情報が列に含まれています。
私はclass = "AB"のdivを1つまたは2つ持っています。だから、基本的に私は1または2の物体ABはテーブル

のすべての行から作成された他のオブジェクトのリストを含む必要がありますので、最初に私は、これらのABのdiv

NodeList ABlist= (NodeList) xpath.evaluate("//div[@class='AB']", document, XPathConstants.NODESET) 

ののNodeListを抽出今私がしようとしています最初のdivのすべてのtr elemsのNodeListを取得します。

NodeList trList = (NodeList) xpath.evaluate("/div/table//tr", ABlist.item(0), XPathConstants.NODESET); 

この場合、trListは空です。私のコードに何が間違っているか知っていますか?
ありがとう

答えて

2

あなたの2番目の故障のXPathでの問題は、あなたが/でそれを開始することです:XPathので

/div/table//tr 

を、単にファイルパスのように、/のパスを開始する「のルートから開始する意味資料"。しかし、あなたは実際にそこでやりたいとは考えていません。あなたのノードから始めたいと思っています。だから:

div/table//tr 

あなたが望むことをします。

+0

あなたはパウエルです!私は(第2引数として)evaluate()メソッドに 'コンテキスト'を渡していると思いました。私はここに投稿する前/しないで試したと思うが、その間に他のものを変更したかもしれないが、その時にはうまくいきませんでした。とにかくそれは今働いている。あなたの助けをありがとう! – mickthompson

+0

そこにコンテキストを渡します。問題は、クエリーで先行する '/'を使用することによって、コンテキストノードからではなく、ノードが属するドキュメントの_root_からパスを開始するように指示することです。 –

0

これはXHTMLですか?あなたのサンプル文書に宣言されている名前空間はなく、その名前空間がなければXHTMLではありません。ネームスペースがあり、それを簡潔に見逃してしまった場合、XPath式はネームスペースも参照する必要があります。それ以外の場合は、何も選択されません。

+0

こんにちはskaffman、私は正しくDivsのABlistを取り戻しています。それは私が動作していないtrListを抽出しようとする方法です。 実際にあなたが正しいです、ドキュメントはネームスペースを指定していないので、おそらくxmlとしか呼ばれません。ネームスペースを指定せずにXML仕様に準拠するだけです。 – mickthompson