4

Xpath式を使用して、XPath式に一致するノードが1つしかないことを確認する方法を理解しようとしています。以下にいくつかのサンプルXMLを示します。

<a>
  <b>
    <c>X:1 Y:0</c>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
  <b>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
</a>

だから、私はこれに似たコードを試しましたが、うまくいきません:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
try {           
    XPathExpression expr = xpath.compile( "count(//a/b/c)" ) );
} catch ( XPathExpressionException e ) {
    printErr( e );
}
if ( expr == true ) {
  // edit XML node
}

count式がBoolean=trueを返す方法があると思われます。どうすればこれを入手できますか?

4

4 に答える 4

9

多分このようなもの:

XPathExpression xpr = xpath.compile("count(//a/b/c)");
System.out.println(xpr.evaluate(n, XPathConstants.NUMBER));

xpr = xpath.compile("count(//a/b/c) = 5");
System.out.println(xpr.evaluate(n, XPathConstants.BOOLEAN));

ここで、nはドキュメントのノード/要素です

最初の印刷は5.0、2番目の印刷はtrue

于 2012-07-22T19:50:38.723 に答える
3

XPath式をコンパイルしただけで、実際には評価していません。

次を使用して式を直接評価できることに注意してくださいXPath.evaluate()

result = xpath.evaluate("count(//a/b/c)", input);

または、プリコンパイル済みを使用しますexpr

result = expr.evaluate(input);

また、これらのevaluateメソッドは、追加の引数として、などの型を取ることもできますXPathConstants.BOOLEAN

したがって、これはXMLinputのとしてでInputSource機能します。

XPathExpression expr = xpath.compile("count(//a/b/c) = 5");
Object retval = expr.evaluate(input, XPathConstants.BOOLEAN);

if ((Boolean) retval)
    // edit XML node
于 2012-07-22T19:48:03.333 に答える
1

あなたは使用することができます

count(//a/b/c) = 1

これは、評価されるtrue()場合にのみ評価され、それ以外の場合にのみ評価count(//a/b/c)されます。1false()

ただし、これは効率的ではない可能性があります(XPath式の完全な評価とすべてのノードのカウントが発生します)。

より効率的なXPath式

(//a/b/c)[1] and not( (//a/b/c)[2] )
于 2012-07-22T23:21:22.710 に答える
0

どう//a/b/c[count(*) != 0]ですか?また、XPathExpressionがオブジェクトを返すことを覚えている場合は、プリミティブ型、つまりxpathNumberをDoubleなどに変換する必要があります。

于 2012-07-22T19:43:52.287 に答える