0

XMLを解析するためにapache JXPathライブラリを使用しています。XPathの評価と同様の機能を実行するJXPathでAPIを見つけようとしています。つまり、xpath式が存在するかどうかを確認しますか? 次の行で似ています

<xsl:when test="

xslt を使用する場合。XPathを使用して同様に行うことができます

XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
InputSource source = new InputSource(new StringReader(xml));
status = xpath.evaluate("/resp/status/solution", source);

ソリューションが存在しない場合、ステータスは null として返されます。現在、JXPath を使用している間、同様の行で API を理解できません。これが私のサンプルコードです

DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder bld = dbfactory.newDocumentBuilder();

ドキュメント metaDoc = bld.parse(in);

JXPathContext metaCtx = JXPathContext.newContext(metaDoc);

ノード node = (ノード)metaCtx.selectSingleNode("/resp/status/solution");

これにより、「JXPathNotFoundException: No value for xpath」がスローされます。実装固有のロジックについては、式がデータを返さない場合や存在しない場合は、if-else ブロックを配置する必要があります。

これに関する任意のポインタは高く評価されます。

ありがとう

4

2 に答える 2

5

JXPathNotFoundExceptionコンテキストをLenient次のように設定することで、これを防ぐことができます。

JXPathContext context = JXPathContext.newContext(myDoc);
context.setLenient(true);

Lenient モード context.getValue(xpath) メソッドは、指定された xpath が既存のプロパティにマップされていない場合、例外をスローします。この制約は、context.setLenient(true) を呼び出すことで緩和できます。寛大なモードでは、パスが何もマップされていない場合、メソッドは単に null を返します。

于 2012-01-09T19:54:16.353 に答える
2

JXPathContext.iterate()を使用してみてください。一致するノードがない場合、空のイテレータを返します (hasNext() は false を返します)。一致するノードが少なくとも 1 つある場合は、next() を呼び出してその値を返します。それ以外の場合は null を返します。

于 2011-10-12T00:02:32.520 に答える