2012-01-25 2 views
1

Мое правило требует, чтобы я применял их только к методам без «get» как часть их имени. Другими словами, мои правила должны применяться только к методам, отличным от геттера в классе. Я знаю, чтобы ухватить все методы не-геттерные, я могу использоватьКак иметь вложенные условия для правил PMD Xpath

//MethodDeclarator[not(contains(@Image,'get'))] 

Однако, я не знаю синтаксис о том, где я вставляю логику правил. Это как

//MethodDeclarator[ 
not(contains(@Image,'get')) 

'Some Rule Statements' 
] 

Я видел использование. в начале инструкции внутри [] в некотором примере кода. для чего они используются?

В моем конкретном случае мне нужно объединить следующие части, но пока я не могу выполнить это.

Часть 1:

//PrimaryExpression[not(PrimarySuffix/Arguments)] 

Часть 2:

//MethodDeclarator[not(contains(@Image,'get'))] 

Часть 3:

//PrimaryExpression[PrimaryPrefix/@Label='this'] 

ответ

1

Вы должны иметь по крайней мере некоторые базовые знания/понимания XPath.

Я видел использование . в начале заявления внутри [] в некотором примере кода. для чего они используются?

[]называется предикат. Он должен содержать логическое выражение. Он должен немедленно следовать узловому тесту. Это указывает дополнительное условие для узла, который удовлетворяет выбранному узловому тесту.

Например:

/*/num 

выбирает все элементы с именем num, которые являются потомками верхнего элемента документа XML.

Однако, если мы хотим выбрать только такие num элементов, значение которого является нечетным числом, мы добавим это дополнительное условие в предикате:

/*/num[. mod 2 = 1] 

Теперь это последнее выражение выбирает все элементы с именем num, которые дети верхнего элемента XML-документа и, строковое значение которых представляет нечетное целое число.

. обозначает узел контекста - это узел, который был выбран так далеко (или начальный узел от которого вычисляется полное выражение XPath).

В моем конкретном случае мне нужно объединить следующие части вместе ...

Вы забыли сказать, каким образом/как должны сочетаться три выражения. В XPath некоторыми из часто используемых «комбинаторов» являются операторы and, or и функция not().

Например, если вы хотите, чтобы выбрать элементы, которые выбираются с помощью всех три предоставляемого XPath выражений, вы можете использовать and оператор:

//PrimaryExpression 
    [not(PrimarySuffix/Arguments) 
    and 
    PrimaryPrefix/@Label='this' 
    ] 
+0

я прочитал больше о XPath этим утром и заставила их правильно комбинированные Теперь. Я также понимаю, что AST в PMD был более обманчивым, чем XML. Гораздо разумнее смотреть на RAW xml и отслеживать его с помощью XPath, чем следовать примерам в PMD doc. Мне не удалось понять, когда использовать/Name и @Image, потому что я не понял их места в XML. – ttback

+0

@ttback: Да, я собирался указать, что вам нужно больше, чем XPath, чтобы узнать семантику PMD. –

+0

Да, я подошел очень близко, чтобы найти один узел в наборе узлов. Если вы хотите, вы можете проверить мой последний вопрос. Без Intersect и знания о том, как использовать ось, становится очень неприятно знать, работаю ли я с набором узлов, с которым, как я думаю, я работаю. – ttback