2015-07-20 78 views
1

我在使用PMD檢查我的代碼錯誤時遇到了一個問題。我不知道如何同時滿足兩個要求。例如,如果我想檢查一個名爲ABC的方法,文件中不存在從BCD擴展的。我知道如何檢查ABC是否存在或者是否使用PMD分別從BCD擴展。結合了兩次PMD檢查

像這樣:

//PrimaryExpression/PrimaryPrefix/Name [@Image = "ABC"]; 
//ExtendsList/ClassOrInterfaceType [@Image != "BCD"]; 

現在,反正是有,我可以檢查這兩個在一起。例如,我希望它在擴展BCD的類中不需要ABC。看來我不能簡單地使用諸如此類的東西來連接這兩個Xpath查詢。另外,我注意到我可以使用|與他們聯繫,但| |作爲或者工作。我需要和這裏而不是或。

編輯:

我想是這樣的:

//PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"] 
[//ancestor::ClassOrInterfaceDeclaration/ExtendsList/ 
            ClassOrInterfaceType[@Image != "BCD"]] 

這似乎是它至少爲我工作。但是我仍然不能100%確定這是否正確,因爲我剛剛嘗試過。

回答

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:: VS ancestor::和我的替代效應。