在java中与JackRabbit JCR一起工作让我头疼。这是一个xpath表达式,用于在我的存储库中搜索实体。
让我们简要介绍一下存储的是什么样的数据,我们有3个名为“Entry”的节点类,它扩展了另一个名为“BaseEntry”的节点类,并扩展了另一个名为“BaseNode”的节点类。Entry类代表我们的JCR系统中的一个节点,它有一组属性(映射为相应类中的属性),并且还继承映射到其超类中的属性。“BaseEntry”类聚合了许多(零个或多个)附件。表示与条目关联的原始文件(.doc、.xls、.pdf、.txt等:D)。
这些是类定义和感兴趣的属性的一部分。。。
“入门”课程
@Node(jcrType = "entry", extend = BaseEntry.class)
public class Entry extends BaseEntry {
... // nothing really important here
}
"BaseEntry"类
@Node(jcrType = "baseEntry", extend = BaseNode.class, isAbstract = true)
public abstract class BaseEntry extends BaseNode {
@Collection (jcrType = "attachment",
collectionConverter = NTCollectionConverterImpl.class)
protected List<Attachment> attachments = new ArrayList<Attachment>();
...
}
"BaseNode"类
@Node(jcrType = "baseNode", isAbstract = true)
public abstract class BaseNode {
@Field(jcrName = "name", id = true)
protected String name;
@Field(jcrName = "creationDate")
protected Date creationDate;
...
}
“附件”类
@Node(jcrType = "attachment", discriminator = true)
public class Attachment extends BaseNode implements Comparable<Attachment> {
/** The attachment's content resource. It cannot be null. */
@Bean(jcrType = "skl:resource", autoUpdate = false)
private Resource content;
...
}
“Resource”Class@Node(jcrType=“skl:Resource”,discriminator=true)
public class Resource extends BaseNode {
/** Resource's MIME type. It cannot be null or empty. */
@Field(jcrName="jcr:mimeType", jcrDefaultValue = "")
private String mimeType;
/** Resource's size (bytes). */
@Field(jcrName="skl:size")
private long size;
/** Resource's content data as stream. It cannot be null. */
@Field(jcrName="jcr:data")
private InputStream data;
...
}
自定义_节点。xml对这些节点有以下定义:
<!-- Base node type definition -->
<nodeType name="docs:baseNode"
isMixin="false"
hasOrderableChildNodes="false" >
<supertypes>
<supertype>nt:hierarchyNode</supertype>
</supertypes>
<propertyDefinition name="docs:name"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="docs:searchPath"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="docs:creationDate"
requiredType="Date"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="docs:lastModified"
requiredType="Date"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<childNodeDefinition name="*"
defaultPrimaryType="docs:baseNode"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
sameNameSiblings="false">
<requiredPrimaryTypes>
<requiredPrimaryType>docs:baseNode</requiredPrimaryType>
</requiredPrimaryTypes>
</childNodeDefinition>
</nodeType>
<!-- Resource node type definition -->
<nodeType name="skl:resource"
isMixin="false"
hasOrderableChildNodes="false" >
<supertypes>
<supertype>docs:baseNode</supertype>
<supertype>nt:resource</supertype>
</supertypes>
<propertyDefinition name="skl:size"
requiredType="Long"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:externalUri"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
</nodeType>
<!-- Attachment node type definition -->
<nodeType name="skl:attachment"
isMixin="false"
hasOrderableChildNodes="false" >
<supertypes>
<supertype>docs:baseNode</supertype>
</supertypes>
<propertyDefinition name="skl:requestId"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:contentExternalUri"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:multiPagePreviewUrl"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
</nodeType>
<!-- Base Entry node type definition -->
<nodeType name="skl:baseEntry"
isMixin="false"
hasOrderableChildNodes="false" >
<supertypes>
<supertype>docs:baseNode</supertype>
</supertypes>
<propertyDefinition name="skl:title"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:description"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:author"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:creator"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:creatorUnique"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:creatorMail"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:office"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:tags"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="true" />
</nodeType>
<!-- SKL Entry node type definition -->
<nodeType name="skl:entry"
isMixin="false"
hasOrderableChildNodes="false" >
<supertypes>
<supertype>docs:baseNode</supertype>
<supertype>skl:baseEntry</supertype>
</supertypes>
<propertyDefinition name="skl:languageName"
requiredType="String"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:rating"
requiredType="Long"
autoCreated="false"
mandatory="true"
onParentVersion="COPY"
protected="false"
multiple="false" />
<propertyDefinition name="skl:urls"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="true" />
<propertyDefinition name="skl:visitors"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="true" />
<propertyDefinition name="skl:datePublished"
requiredType="String"
autoCreated="false"
mandatory="false"
onParentVersion="COPY"
protected="false"
multiple="false" />
</nodeType>
所以我期待make和xpath语句来搜索附件中包含某种文本的条目。所以基本上,这个想法是搜索包含特定文本或关键字的文件的条目。
到目前为止,我尝试过这样的东西。。。
String xPathQuery = "<BASE PATH>//element(*, skl:entry) [jcr:contains(*//content,'*<keyword>*')]";
String xPathQuery = "<BASE PATH>//element(*, skl:entry) [jcr:contains(*//@jcr:data,'*<keyword>*')]";
但这些东西并不像你想象的那么有效。。。
我希望,一个慈善的灵魂可以帮助我完成这个任务。。这可不是件好事:S.谢谢大家提前看这件事!。
问候语!!
维克托
Jackrabbit常见问题解答解释了您的问题:
为什么//*[jcr:contains(@jcr:data,'foo')]不返回二进制内容的匹配项?
从二进制内容中提取的文本仅在@jcr:data属性的父节点上编制索引。在nt:resource节点上使用jcr:contains()。
所以在你的情况下,我会使用类似于:
String xPathQuery = "<BASE PATH>//element(*, skl:resource)[jcr:contains(.,'*<keyword>*')]";
或
String xPathQuery = "<BASE PATH>//element(*, skl:entry)//element(*, skl:resource)[jcr:contains(.,'*<keyword>*')]";
我还强烈反对在包含语句的开头使用*通配符。由于Lucene是一个倒置索引,这可能非常低效。
问题内容: 我使用XPather浏览器检查HTML页面上的XPATH表达式。 我的最终目标是在Selenium中使用这些表达式来测试用户界面。 我得到了一个HTML文件,其内容类似于以下内容: 我想选择一个包含字符串“ ” 的文本的节点。 使用“ abc”这样的普通字符串不会有问题。我使用类似于的XPATH 。 当我尝试使用类似的XPATH时,不会返回任何内容。关于带有“ ”的文本是否有特殊规定?
我想搜索CQ5.6(AEM)实例中包含的JCR存储库中包含给定字符串的所有文件。由于对JCR对XPath(或JCR-SQL2)的解释不熟悉,我在表达查询方面不太成功。 这将得到我所有的文件: 这就是我希望如何限制上面包含的文件列表: 类型为。以上这些似乎都不起作用。我哪里做错了?
无法完成这项理论上相对简单的任务: 查找节点文档,其中Field具有包含特定文本的属性Name,并且子节点Option具有值。 XML: 所以我希望能够将模板应用到文档中,比如 但那是行不通的。 只需指定:文档必须在选项中包含文本,该选项是包含特定文本的字段的子节点。 在xml中,使用输入值: 1:Børn Fridslip= 2: Børn-Fritidsklub= 3:Børn Fritid=
问题内容: 我想在包含单行的超大文件(fe大于1 GB)中搜索模式。无法将其加载到内存中。目前,我使用读入缓冲区(1024个字符)。主要步骤: 将数据读入两个缓冲区 该缓冲区中的搜索模式 如果找到模式,则增加变量 将第二个缓冲区复制到第一个 将数据加载到第二个缓冲区 在两个缓冲区中搜索模式。 如果找到模式,则增加变量 重复上述步骤(从4开始),直到EOF 该算法(两个缓冲区)让我避免了将搜索到的文
虽然这不是一个直接的开发问题,但它确实与一个开发工具有关,这与我的开发工作非常相关: 当我在 VSCode (CTRL P) 中搜索文件时,我发现它不包含作为 .gitignore 文件一部分的文件和文件夹。 我可以很好地理解其中的逻辑,这很好,但我如何禁用它(默认设置?)行为也就是说,我确实希望这个搜索包括项目中的所有文件,而不管是.gitignore文件(还是其他任何忽略文件)。
上面的XPath查询捕获了我正在查看的特定部分中的所有文本,这很棒。但是,我只需要知道testuser是否在那个部分。