Попытка найти строку внутри последовательности строк с помощью XPath

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

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

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

Я столкнулся с этой проблемой, потому что VariableDeclaratorId/@Image возвращает две строки, когда есть несколько полей для анализа. Я не нашел решения, чтобы решить эту проблему. Я думал об использовании предикатов, но это уже содержит внутри предиката, выполнение 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);
    }
  }

НЕОБРАБОТАННЫЙ 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>

person ttback    schedule 26.01.2012    source источник
comment
Привет, @ttback. Причина, по которой вы не получаете ответов (на этот или предыдущий вопрос), заключается в том, что вы не пишете вопросы, на которые легко найти ответы. Вы всегда должны предоставлять входной XML (который вы сделали) и точный желаемый результат, который вы ищете на основе этого ввода. Здесь вы показали нам полученную ошибку и несколько случайных выражений, которые вы пробовали, но вы никогда не говорили нам, каков ожидаемый результат и мы не можем читать мысли.   -  person Wayne    schedule 26.01.2012
comment
@lwburk: я добавил ожидаемый результат, если он может сделать его более понятным. Извините, если это было недостаточно ясно, я немного торопился, когда публиковал это. У меня на уме было куча вещей.   -  person ttback    schedule 26.01.2012


Ответы (1)


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

person Michael Kay    schedule 26.01.2012
comment
Спасибо. Решил. Я не нашел эту спецификацию до сегодняшнего вечера. Я потратил слишком много времени на чтение и предположения по документу PMD, не заглянув достаточно в XPath. Также было неясно, какую спецификацию XPath PMD использует в какой-то момент. Мне потребовалось некоторое время, чтобы разобраться в этих основах. Спасибо еще раз. - person ttback; 27.01.2012