我在使用PMD检查代码错误时遇到了问题。我不知道如何同时满足两个要求。例如,如果我想检查名为ABC的方法,则文件中不存在扩展自BCD的方法。我知道如何检查ABC是否存在或者是否使用PMD分别从BCD扩展。
像这样:
//PrimaryExpression/PrimaryPrefix/Name [@Image = "ABC"];
//ExtendsList/ClassOrInterfaceType [@Image != "BCD"];
现在,无论如何,我可以一起检查这两个。例如,我想要它在类中没有ABC扩展BCD。看来我不能简单地使用和连接这两个Xpath查询的东西。另外,我注意到我可以使用|与他们建立联系,但是|作为或工作。我需要一个和这里而不是或。
修改
我试过这样的事情:
//PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"]
[//ancestor::ClassOrInterfaceDeclaration/ExtendsList/
ClassOrInterfaceType[@Image != "BCD"]]
这似乎至少对我有用。但是我仍然不能100%确定这是否是正确的方法,因为我刚尝试过这个。
答案 0 :(得分:1)
您的编辑应该有效,但请注意ancestor
轴将递归所有父节点,因此不应该使用'//'来引入它。
另一种方法是将Xpath从共同的祖先(例如ClassOrInterfaceDeclaration
)开始,然后使用and
来确保满足这两个条件。由于您似乎只是测试满足两个条件的节点的存在,我想结果表达式/节点集实际返回的内容并不重要:
//ClassOrInterfaceDeclaration[ExtendsList/ClassOrInterfaceType[@Image != "BCD"]
and descendant::PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"]]
但是,如果您确实需要在成功时选择特定节点,只需追加相对于ClassOrInterfaceDeclaration
的节点路径:
//ClassOrInterfaceDeclaration[... predicate ...]/Some/Path/Here
您还可以应用count()
之类的函数来确定符合条件的节点数:
count(//ClassOrInterfaceDeclaration[... predicate ...])
然后评估表达式。
(警告 - 我不熟悉PMD布局)
I've put some examples显示了//ancestor::
与ancestor::
和我的替代方案的影响。