Java 基于祖先元素的XPath查找元素
同样,我有JavaAST,它是从Java 基于祖先元素的XPath查找元素,java,xml,xpath,abstract-syntax-tree,Java,Xml,Xpath,Abstract Syntax Tree,同样,我有JavaAST,它是从 public class Test { String o = new String("hh"); public void wrong1() { synchronized(o) { // huhu } } } 我尝试创建一个XPath查询,用于查找使用已定义字符串变量o的同步块 正如上面的定义,它是SynchronizedStatement的祖先,但我无法让它工作 //Synchro
public class Test {
String o = new String("hh");
public void wrong1() {
synchronized(o) {
// huhu
}
}
}
我尝试创建一个XPath查询,用于查找使用已定义字符串变量o
的同步块
正如上面的定义,它是SynchronizedStatement的祖先,但我无法让它工作
//SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=ancestor::ClassOrInterfaceBody[ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image]]]
我知道/SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=
是正确的,我的问题是如何处理祖先类或接口体部分
希望我的意思很清楚;-)
感谢测试两个@Image是否相同
//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image ]
为了测试字符串类型,假设FieldDeclaration和FieldVariableDeclaratorId具有公共属性(名称)
如果原始XPath中的@Image为“字符串”:
谢谢你,这是可行的。但另一个问题是,基本上我想检查两个@Image是否相同,但前提是变量是字符串。所以Object o=new Object();不应匹配…我如何组合这两个条件a)检查@Image,并且找到的祖先元素也是字符串类型。我知道如何检查它是否是字符串,但不知道如何组合到搜索(它们在同一节点上工作). THANKS@martymcfly字符串类型的测试是什么,在哪个节点上?基本上是在上面的祖先中。伪类图像与
祖先进行比较:ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/VariableDeclarator/VariableDeclaratorId/@image
,并对该祖先进行字符串比较ncestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/Type/ReferenceType/ClassOrInterfaceType[@Image='String']
因此,基本上,字段声明
是包含字符串和名称信息的节点。但是,ClassOrInterfaceBody
是这个和synchront.statement的共同祖先。我需要两个祖先调用完全相同的祖先。如果这是任何其他字段声明,它是一个字符串,而不仅仅是同步块中的字段声明。@martymcfly我们需要能够从FieldVariableDeclaratorId中找到一个FieldDeclaration。是否有FieldDeclaration/@Id?
//SynchronizedStatement[
Expression/PrimaryExpression/PrimaryPrefix/Name/@Image =
ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId[
@name = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[Type/ReferenceType/ClassOrInterfaceType/@Image = 'String']/@name
]/@Image
]
//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image[. = 'String'] ]