2012-01-26 3 views
0

Я столкнулся с ошибкой, в которой говорится, что «XPath не удалось из-за: Последовательность из более чем одного элемента не разрешена в качестве первого аргумента contains() ('string1' , 'string2') ", когда я пытаюсь использовать keep, чтобы найти одну строку внутри последовательности.Попытка найти строку внутри последовательности строк с XPath

Мой код связан с разрешения мой другой вопрос https://stackoverflow.com/questions/9006479/with-pmd-and-xpath-can-i-determine-if-two-node-sets-have-any-node-in-common

Expression/PrimaryExpression/PrimaryPrefix 
[ 
contains(ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/VariableDeclarator/VariableDeclaratorId/@Image,./Name/@Image) 
] 

Я побежал в этом вопросе, потому что VariableDeclaratorId/@ Изображение возвращает две строки, когда есть несколько полей для синтаксического анализа. Я не нашел решения для решения этой проблемы. Я думал об использовании предикатов, но это уже содержит внутри предиката, поскольку VariableDeclaratorId/@ Image [./ Name/@ Image] не работает, потому что этот [./Name/@Image] отличается от PrimaryPrefix/Name/@Образ.

Ожидаемый выход:

<Expression BeginColumn="26" BeginLine="6" EndColumn="30" EndLine="6" Image="" Label=""> 
     <PrimaryExpression BeginColumn="26" BeginLine="6" EndColumn="30" EndLine="6" Image="" Label=""> 
      <PrimaryPrefix BeginColumn="26" BeginLine="6" EndColumn="30" EndLine="6" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
       <Name BeginColumn="26" BeginLine="6" EndColumn="30" EndLine="6" Image="m_foo" Label=""/> 
      </PrimaryPrefix> 
     </PrimaryExpression> 
    </Expression> 


    <Expression BeginColumn="26" BeginLine="7" EndColumn="30" EndLine="7" Image="" Label=""> 
     <PrimaryExpression BeginColumn="26" BeginLine="7" EndColumn="30" EndLine="7" Image="" Label=""> 
      <PrimaryPrefix BeginColumn="26" BeginLine="7" EndColumn="30" EndLine="7" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
       <Name BeginColumn="26" BeginLine="7" EndColumn="30" EndLine="7" Image="m_two" Label=""/> 
      </PrimaryPrefix> 
     </PrimaryExpression> 
    </Expression> 

Jave Источник:

public class domainFunction { 
    private int m_foo; // OK 

    public void bar() { 
     calculate (random); 
     System.out.println(m_foo); 
     System.out.println(m_two); 
    } 
    } 

RAW XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <CompilationUnit BeginColumn="1" BeginLine="1" EndColumn="3" EndLine="13" Image="" Label="" declarationsAreInDefaultPackage="true"> 
     <TypeDeclaration BeginColumn="1" BeginLine="1" EndColumn="3" EndLine="13" Image="" Label=""> 
      <ClassOrInterfaceDeclaration Abstract="false" BeginColumn="8" BeginLine="1" EndColumn="3" EndLine="13" Final="false" Image="domainFunction" Interface="false" Label="" Modifiers="1" Native="false" Nested="false" PackagePrivate="false" Private="false" Protected="false" Public="true" Static="false" Strictfp="false" Synchronized="false" Transient="false" Volatile="false"> 
       <ClassOrInterfaceBody BeginColumn="29" BeginLine="1" EndColumn="3" EndLine="13" Image="" Label=""> 
        <ClassOrInterfaceBodyDeclaration AnonymousInnerClass="false" BeginColumn="5" BeginLine="2" EndColumn="22" EndLine="2" EnumChild="false" Image="" Label=""> 
         <FieldDeclaration Abstract="false" Array="false" ArrayDepth="0" BeginColumn="13" BeginLine="2" EndColumn="22" EndLine="2" Final="false" Image="" InterfaceMember="false" Label="" Modifiers="4" Native="false" PackagePrivate="false" Private="true" Protected="false" Public="false" Static="false" Strictfp="false" Synchronized="false" SyntacticallyFinal="false" SyntacticallyPublic="false" SyntacticallyStatic="false" Transient="false" VariableName="m_foo" Volatile="false"> 
          <Type Array="false" ArrayDepth="0" BeginColumn="13" BeginLine="2" EndColumn="15" EndLine="2" Image="" Label="" TypeImage="int"> 
           <PrimitiveType Array="false" ArrayDepth="0" BeginColumn="13" BeginLine="2" Boolean="false" EndColumn="15" EndLine="2" Image="int" Label=""/> 
          </Type> 
          <VariableDeclarator BeginColumn="17" BeginLine="2" EndColumn="21" EndLine="2" Image="" Label=""> 
           <VariableDeclaratorId Array="false" ArrayDepth="0" BeginColumn="17" BeginLine="2" EndColumn="21" EndLine="2" ExceptionBlockParameter="false" Image="m_foo" Label=""/> 
          </VariableDeclarator> 
         </FieldDeclaration> 
        </ClassOrInterfaceBodyDeclaration> 
        <ClassOrInterfaceBodyDeclaration AnonymousInnerClass="false" BeginColumn="5" BeginLine="3" EndColumn="22" EndLine="3" EnumChild="false" Image="" Label=""> 
         <FieldDeclaration Abstract="false" Array="false" ArrayDepth="0" BeginColumn="13" BeginLine="3" EndColumn="22" EndLine="3" Final="false" Image="" InterfaceMember="false" Label="" Modifiers="4" Native="false" PackagePrivate="false" Private="true" Protected="false" Public="false" Static="false" Strictfp="false" Synchronized="false" SyntacticallyFinal="false" SyntacticallyPublic="false" SyntacticallyStatic="false" Transient="false" VariableName="m_two" Volatile="false"> 
          <Type Array="false" ArrayDepth="0" BeginColumn="13" BeginLine="3" EndColumn="15" EndLine="3" Image="" Label="" TypeImage="int"> 
           <PrimitiveType Array="false" ArrayDepth="0" BeginColumn="13" BeginLine="3" Boolean="false" EndColumn="15" EndLine="3" Image="int" Label=""/> 
          </Type> 
          <VariableDeclarator BeginColumn="17" BeginLine="3" EndColumn="21" EndLine="3" Image="" Label=""> 
           <VariableDeclaratorId Array="false" ArrayDepth="0" BeginColumn="17" BeginLine="3" EndColumn="21" EndLine="3" ExceptionBlockParameter="false" Image="m_two" Label=""/> 
          </VariableDeclarator> 
         </FieldDeclaration> 
        </ClassOrInterfaceBodyDeclaration> 
        <ClassOrInterfaceBodyDeclaration AnonymousInnerClass="false" BeginColumn="5" BeginLine="4" EndColumn="5" EndLine="11" EnumChild="false" Image="" Label=""> 
         <MethodDeclaration Abstract="false" BeginColumn="12" BeginLine="4" EndColumn="5" EndLine="11" Final="false" Image="" InterfaceMember="false" Label="" MethodName="bar" Modifiers="1" Native="false" PackagePrivate="false" Private="false" Protected="false" Public="true" Static="false" Strictfp="false" Synchronized="false" SyntacticallyAbstract="false" SyntacticallyPublic="true" Transient="false" Void="true" Volatile="false"> 
          <ResultType BeginColumn="12" BeginLine="4" EndColumn="15" EndLine="4" Image="" Label="" Void="true" returnsArray="false"/> 
          <MethodDeclarator BeginColumn="17" BeginLine="4" EndColumn="21" EndLine="4" Image="bar" Label="" ParameterCount="0"> 
           <FormalParameters BeginColumn="20" BeginLine="4" EndColumn="21" EndLine="4" Image="" Label="" ParameterCount="0"/> 
          </MethodDeclarator> 
          <Block BeginColumn="23" BeginLine="4" EndColumn="5" EndLine="11" Image="" Label="" containsComment="false"> 
           <BlockStatement Allocation="false" BeginColumn="7" BeginLine="5" EndColumn="22" EndLine="5" Image="" Label=""> 
            <LocalVariableDeclaration Abstract="false" Array="false" ArrayDepth="0" BeginColumn="7" BeginLine="5" EndColumn="21" EndLine="5" Final="false" Image="" Label="" Modifiers="0" Native="false" PackagePrivate="true" Private="false" Protected="false" Public="false" Static="false" Strictfp="false" Synchronized="false" Transient="false" VariableName="random" Volatile="false"> 
             <Type Array="false" ArrayDepth="0" BeginColumn="7" BeginLine="5" EndColumn="9" EndLine="5" Image="" Label="" TypeImage="int"> 
              <PrimitiveType Array="false" ArrayDepth="0" BeginColumn="7" BeginLine="5" Boolean="false" EndColumn="9" EndLine="5" Image="int" Label=""/> 
             </Type> 
             <VariableDeclarator BeginColumn="11" BeginLine="5" EndColumn="21" EndLine="5" Image="" Label=""> 
              <VariableDeclaratorId Array="false" ArrayDepth="0" BeginColumn="11" BeginLine="5" EndColumn="16" EndLine="5" ExceptionBlockParameter="false" Image="random" Label=""/> 
              <VariableInitializer BeginColumn="20" BeginLine="5" EndColumn="21" EndLine="5" Image="" Label=""> 
               <Expression BeginColumn="20" BeginLine="5" EndColumn="21" EndLine="5" Image="" Label=""> 
                <PrimaryExpression BeginColumn="20" BeginLine="5" EndColumn="21" EndLine="5" Image="" Label=""> 
                 <PrimaryPrefix BeginColumn="20" BeginLine="5" EndColumn="21" EndLine="5" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                  <Literal BeginColumn="20" BeginLine="5" CharLiteral="false" EndColumn="21" EndLine="5" FloatLiteral="false" Image="12" IntLiteral="true" Label="" SingleCharacterStringLiteral="false" StringLiteral="false"/> 
                 </PrimaryPrefix> 
                </PrimaryExpression> 
               </Expression> 
              </VariableInitializer> 
             </VariableDeclarator> 
            </LocalVariableDeclaration> 
           </BlockStatement> 
           <BlockStatement Allocation="false" BeginColumn="7" BeginLine="6" EndColumn="25" EndLine="6" Image="" Label=""> 
            <Statement BeginColumn="7" BeginLine="6" EndColumn="25" EndLine="6" Image="" Label=""> 
             <StatementExpression BeginColumn="7" BeginLine="6" EndColumn="24" EndLine="6" Image="" Label=""> 
              <PrimaryExpression BeginColumn="7" BeginLine="6" EndColumn="24" EndLine="6" Image="" Label=""> 
               <PrimaryPrefix BeginColumn="7" BeginLine="6" EndColumn="15" EndLine="6" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                <Name BeginColumn="7" BeginLine="6" EndColumn="15" EndLine="6" Image="calculate" Label=""/> 
               </PrimaryPrefix> 
               <PrimarySuffix ArgumentCount="1" Arguments="true" ArrayDereference="false" BeginColumn="17" BeginLine="6" EndColumn="24" EndLine="6" Image="" Label=""> 
                <Arguments ArgumentCount="1" BeginColumn="17" BeginLine="6" EndColumn="24" EndLine="6" Image="" Label=""> 
                 <ArgumentList BeginColumn="18" BeginLine="6" EndColumn="23" EndLine="6" Image="" Label=""> 
                  <Expression BeginColumn="18" BeginLine="6" EndColumn="23" EndLine="6" Image="" Label=""> 
                   <PrimaryExpression BeginColumn="18" BeginLine="6" EndColumn="23" EndLine="6" Image="" Label=""> 
                    <PrimaryPrefix BeginColumn="18" BeginLine="6" EndColumn="23" EndLine="6" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                     <Name BeginColumn="18" BeginLine="6" EndColumn="23" EndLine="6" Image="random" Label=""/> 
                    </PrimaryPrefix> 
                   </PrimaryExpression> 
                  </Expression> 
                 </ArgumentList> 
                </Arguments> 
               </PrimarySuffix> 
              </PrimaryExpression> 
             </StatementExpression> 
            </Statement> 
           </BlockStatement> 
           <BlockStatement Allocation="false" BeginColumn="7" BeginLine="7" EndColumn="24" EndLine="7" Image="" Label=""> 
            <Statement BeginColumn="7" BeginLine="7" EndColumn="24" EndLine="7" Image="" Label=""> 
             <StatementExpression BeginColumn="7" BeginLine="7" EndColumn="23" EndLine="7" Image="" Label=""> 
              <PrimaryExpression BeginColumn="7" BeginLine="7" EndColumn="23" EndLine="7" Image="" Label=""> 
               <PrimaryPrefix BeginColumn="7" BeginLine="7" EndColumn="15" EndLine="7" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                <Name BeginColumn="7" BeginLine="7" EndColumn="15" EndLine="7" Image="calculate" Label=""/> 
               </PrimaryPrefix> 
               <PrimarySuffix ArgumentCount="1" Arguments="true" ArrayDereference="false" BeginColumn="17" BeginLine="7" EndColumn="23" EndLine="7" Image="" Label=""> 
                <Arguments ArgumentCount="1" BeginColumn="17" BeginLine="7" EndColumn="23" EndLine="7" Image="" Label=""> 
                 <ArgumentList BeginColumn="18" BeginLine="7" EndColumn="22" EndLine="7" Image="" Label=""> 
                  <Expression BeginColumn="18" BeginLine="7" EndColumn="22" EndLine="7" Image="" Label=""> 
                   <PrimaryExpression BeginColumn="18" BeginLine="7" EndColumn="22" EndLine="7" Image="" Label=""> 
                    <PrimaryPrefix BeginColumn="18" BeginLine="7" EndColumn="22" EndLine="7" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                     <Name BeginColumn="18" BeginLine="7" EndColumn="22" EndLine="7" Image="m_foo" Label=""/> 
                    </PrimaryPrefix> 
                   </PrimaryExpression> 
                  </Expression> 
                 </ArgumentList> 
                </Arguments> 
               </PrimarySuffix> 
              </PrimaryExpression> 
             </StatementExpression> 
            </Statement> 
           </BlockStatement> 
           <BlockStatement Allocation="false" BeginColumn="7" BeginLine="8" EndColumn="32" EndLine="8" Image="" Label=""> 
            <Statement BeginColumn="7" BeginLine="8" EndColumn="32" EndLine="8" Image="" Label=""> 
             <StatementExpression BeginColumn="7" BeginLine="8" EndColumn="31" EndLine="8" Image="" Label=""> 
              <PrimaryExpression BeginColumn="7" BeginLine="8" EndColumn="31" EndLine="8" Image="" Label=""> 
               <PrimaryPrefix BeginColumn="7" BeginLine="8" EndColumn="24" EndLine="8" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                <Name BeginColumn="7" BeginLine="8" EndColumn="24" EndLine="8" Image="System.out.println" Label=""/> 
               </PrimaryPrefix> 
               <PrimarySuffix ArgumentCount="1" Arguments="true" ArrayDereference="false" BeginColumn="25" BeginLine="8" EndColumn="31" EndLine="8" Image="" Label=""> 
                <Arguments ArgumentCount="1" BeginColumn="25" BeginLine="8" EndColumn="31" EndLine="8" Image="" Label=""> 
                 <ArgumentList BeginColumn="26" BeginLine="8" EndColumn="30" EndLine="8" Image="" Label=""> 
                  <Expression BeginColumn="26" BeginLine="8" EndColumn="30" EndLine="8" Image="" Label=""> 
                   <PrimaryExpression BeginColumn="26" BeginLine="8" EndColumn="30" EndLine="8" Image="" Label=""> 
                    <PrimaryPrefix BeginColumn="26" BeginLine="8" EndColumn="30" EndLine="8" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                     <Name BeginColumn="26" BeginLine="8" EndColumn="30" EndLine="8" Image="m_foo" Label=""/> 
                    </PrimaryPrefix> 
                   </PrimaryExpression> 
                  </Expression> 
                 </ArgumentList> 
                </Arguments> 
               </PrimarySuffix> 
              </PrimaryExpression> 
             </StatementExpression> 
            </Statement> 
           </BlockStatement> 
           <BlockStatement Allocation="false" BeginColumn="7" BeginLine="9" EndColumn="32" EndLine="9" Image="" Label=""> 
            <Statement BeginColumn="7" BeginLine="9" EndColumn="32" EndLine="9" Image="" Label=""> 
             <StatementExpression BeginColumn="7" BeginLine="9" EndColumn="31" EndLine="9" Image="" Label=""> 
              <PrimaryExpression BeginColumn="7" BeginLine="9" EndColumn="31" EndLine="9" Image="" Label=""> 
               <PrimaryPrefix BeginColumn="7" BeginLine="9" EndColumn="24" EndLine="9" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                <Name BeginColumn="7" BeginLine="9" EndColumn="24" EndLine="9" Image="System.out.println" Label=""/> 
               </PrimaryPrefix> 
               <PrimarySuffix ArgumentCount="1" Arguments="true" ArrayDereference="false" BeginColumn="25" BeginLine="9" EndColumn="31" EndLine="9" Image="" Label=""> 
                <Arguments ArgumentCount="1" BeginColumn="25" BeginLine="9" EndColumn="31" EndLine="9" Image="" Label=""> 
                 <ArgumentList BeginColumn="26" BeginLine="9" EndColumn="30" EndLine="9" Image="" Label=""> 
                  <Expression BeginColumn="26" BeginLine="9" EndColumn="30" EndLine="9" Image="" Label=""> 
                   <PrimaryExpression BeginColumn="26" BeginLine="9" EndColumn="30" EndLine="9" Image="" Label=""> 
                    <PrimaryPrefix BeginColumn="26" BeginLine="9" EndColumn="30" EndLine="9" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                     <Name BeginColumn="26" BeginLine="9" EndColumn="30" EndLine="9" Image="m_two" Label=""/> 
                    </PrimaryPrefix> 
                   </PrimaryExpression> 
                  </Expression> 
                 </ArgumentList> 
                </Arguments> 
               </PrimarySuffix> 
              </PrimaryExpression> 
             </StatementExpression> 
            </Statement> 
           </BlockStatement> 
           <BlockStatement Allocation="false" BeginColumn="7" BeginLine="10" EndColumn="28" EndLine="10" Image="" Label=""> 
            <Statement BeginColumn="7" BeginLine="10" EndColumn="28" EndLine="10" Image="" Label=""> 
             <StatementExpression BeginColumn="7" BeginLine="10" EndColumn="27" EndLine="10" Image="" Label=""> 
              <PrimaryExpression BeginColumn="7" BeginLine="10" EndColumn="27" EndLine="10" Image="" Label=""> 
               <PrimaryPrefix BeginColumn="7" BeginLine="10" EndColumn="10" EndLine="10" Image="" Label="this" SuperModifier="false" ThisModifier="true"/> 
               <PrimarySuffix ArgumentCount="" Arguments="false" ArrayDereference="false" BeginColumn="11" BeginLine="10" EndColumn="20" EndLine="10" Image="calculate" Label=""/> 
               <PrimarySuffix ArgumentCount="1" Arguments="true" ArrayDereference="false" BeginColumn="21" BeginLine="10" EndColumn="27" EndLine="10" Image="" Label=""> 
                <Arguments ArgumentCount="1" BeginColumn="21" BeginLine="10" EndColumn="27" EndLine="10" Image="" Label=""> 
                 <ArgumentList BeginColumn="22" BeginLine="10" EndColumn="26" EndLine="10" Image="" Label=""> 
                  <Expression BeginColumn="22" BeginLine="10" EndColumn="26" EndLine="10" Image="" Label=""> 
                   <PrimaryExpression BeginColumn="22" BeginLine="10" EndColumn="26" EndLine="10" Image="" Label=""> 
                    <PrimaryPrefix BeginColumn="22" BeginLine="10" EndColumn="26" EndLine="10" Image="" Label="" SuperModifier="false" ThisModifier="false"> 
                     <Name BeginColumn="22" BeginLine="10" EndColumn="26" EndLine="10" Image="m_foo" Label=""/> 
                    </PrimaryPrefix> 
                   </PrimaryExpression> 
                  </Expression> 
                 </ArgumentList> 
                </Arguments> 
               </PrimarySuffix> 
              </PrimaryExpression> 
             </StatementExpression> 
            </Statement> 
           </BlockStatement> 
          </Block> 
         </MethodDeclaration> 
        </ClassOrInterfaceBodyDeclaration> 
       </ClassOrInterfaceBody> 
      </ClassOrInterfaceDeclaration> 
     </TypeDeclaration> 
    </CompilationUnit> 
+0

Здравствуйте, @ttback. Причина, по которой вы не получаете ответы (на этот или ваш предыдущий вопрос), заключается в том, что вы не пишете вопросы, которые поддаются легким ответам. Вы всегда должны предоставлять входной XML (который вы сделали) и * точный * желаемый вывод, который вы ищете на основе этого ввода. Здесь вы показали нам полученную вами ошибку и некоторые случайные выражения, которые вы пробовали, но вы никогда не говорили нам, что ожидаемый результат * и * мы не можем читать мысли *. –

+0

@ lwburk: Я добавил ожидаемый результат, если он может сделать его более понятным. Извините, если он не был достаточно ясным, я был немного поспешен, когда я публиковал это. На мой взгляд, было много штук. – ttback

ответ

0

Я думаю, что вы используете function contains(), потому что вы неправильно догадались, что он проверяет, содержит ли набор строк заданную строку. Не угадайте, прочитайте спецификацию: это не то, что содержит(); скорее, он проверяет, содержит ли одна строка другую в качестве подстроки. Чтобы проверить, содержит ли набор строк $ S строку $ T, используйте ($ S = $ T).

+0

Спасибо. Он решил. Я не нашел эту технику до сегодняшнего вечера. Я потратил слишком много времени на чтение и догадки о докторе PMD, не глядя достаточно на XPath. Также неясно, какой XPD spec PMD использует в какой-то момент. Мне потребовалось некоторое время, чтобы разобраться в этих основах. Еще раз спасибо. – ttback