-XPath機能コンポーネント

XPath xpath = new SpecificationXPath("/*[@m:mayaID='testID1']");
// XML文書のプレフィックスマッピングとXPath式のそれが一緒であれば不要
// xpath.addNamespace("m", URI_MAYA);
List list = xpath.selectNodes(_specification);
assertEquals(2, list.size());
SpecificationNode node = (SpecificationNode)list.get(0);
String mayaID = SpecificationUtil.getAttributeValue(node, QM_MAYA_ID);
assertEquals("testID1", mayaID);
node = (SpecificationNode)list.get(1);
mayaID = SpecificationUtil.getAttributeValue(node, QM_MAYA_ID);
assertEquals("testID1", mayaID);

上記のテストコードが通ったので、XPathによるノード検索機能コンポーネントは完成。

SimpleNamespaceContext namespace = new SimpleNamespaceContext();
// XML文書のプレフィックスマッピングとXPath式のそれが一緒であれば不要
// namespace.addNamespace("m", URI_MAYA);
ContextSupport support = new ContextSupport(
    namespace,
    XPathFunctionContext.getInstance(),
    new SimpleVariableContext(),
    SpecificationNavigator.getInstance());
Context context = new Context(support);
Pattern pattern = PatternParser.parse("/m:testName1[@m:mayaID='testID1']");
assertTrue(pattern.matches(_node1, context));
assertFalse(pattern.matches(_node2, context));
assertFalse(pattern.matches(_node3, context));
assertFalse(pattern.matches(_node4, context));

上記のテストコードが通ったので、XPathによるパターンマッチ機能コンポーネントは完成。パターンマッチはJaxenのそのままでは使いにくいので、くるんで使ったほうがいいな。ちょっと苦労したのは、このパターンマッチのほうがWEBを探してもAPIの使い方を記したドキュメントやサンプルが見つからなかったこと。DOM4Jのソース中に一箇所、近似の機能を発見して、それを参考に試行錯誤しました。最後までひっかかったのは、DOM4Jでの使われ方は、XML文書のプレフィックスマッピングとXPath式のそれが一緒と決め打ちだったので、どうやって名前空間対応したものかで大変。上記の二つのテストコードは、Jaxenを利用したいという奇特な方がいたとしたら、助けになると思います。しばらくずっと風呂タイムをJaxenに費やしたので(笑)かなりJaxenに詳しくなりました。BLOGをさかのぼると3月からです。その間、非Jaxenでも、XPath周りのことばかりやってました。あとは組み込み。
もし私が忘れないうちであれば、新たなるJaxen利用者がハマらないよう助けます。ご連絡ください>奇特な方。