2017-12-21 22 views
1

次のステートメントを使って、私はi = 1のvalis応答を得ますが、i = 2などを試してみると、配列外の例外が出ます。返り値n番目の子

AutoPilot resultNode = new AutoPilot(); 
resultNode.selectXPath("/top/level[@sev='4']/item/title/text()[i]"); 
resultNode.bind(vn); 
int z = resultNode.evalXPath(); 
System.out.println("TEST: "+vn.toString(z)); 

例XML:

<top> 
    <level sev="4"> 
    <item> 
     <title>gngsfjdsf</title> 
     <p1>2</p1> 
     <p2>2</p2> 
    </item> 
    <item> 
     <title>sdadad</title> 
     <p1>2</p1> 
     <p2>2</p2> 
    </item> 
    </level> 
    <level sev="3"> 
    <item> 
     <title>3214125421</title> 
     <p1>2</p1> 
     <p2>1</p2> 
    </item> 
    <item> 
     <title>kjhkjtnjy</title> 
     <p1>1</p1> 
     <p2>2</p2> 
    </item> 
    </level> 
</top> 
+0

あなたはevalXPathから返された値が-1である条件をテストする必要があります。 –

答えて

3

この:あなたはあなたが唯一の第二いずれかを選択する必要が

gngsfjdsf 
sdadad 

、および:

/top/level[@sev='4']/item/title/text() 

実際に2つの値を返します。かっこを使用して行うことができます:

(/top/level[@sev='4']/item/title/text())[2] 

リターンのみ

sdadad 

あなたの失敗の理由は、.../text()[2]試みが見つかった各ノードの2番目のテキストノードではなく、全体の2番目のノードを発見することです。


アンでもよりよい解決策ではなく、一致するすべてのノードの第二text()のノードを取得するだけでしようとする第二itemノードを選択することです...

/top/level[@sev='4']/item[2]/title/text() 
+0

申し訳ありません、私はi = 1とi = 2を参照して、私のサンプルコードで値をハードコードしました。 2番目の値を取得するために使用している式は/ top/level [@ sev = '4']/item/title/text()[2]ですが、事実その項目が存在するはずです – Ben

+0

@ベン。うん、私はあなたの本当の質問に答えると信じています。どちらの表現も、あなたが望むのと同じように、 'sdadad'にしかマッチしません。そうでない場合は、1と2の両方に期待される出力を表示してください。私はあなたが1の "gngsfjdsf"と2の "sdadad"を望むと思った。 –

+0

@Lino XPathでは、配列は1から始まります。 [1]は最初の要素を取得し、[2]は秒を取得します。 – AJNeufeld

1

あなたは2番目のテキストノードを持っていけませんタイトル要素のために。したがって、evalXPath()は、範囲外の例外をスローするはずの-1を返さなければなりません。