如果我错过了这个问题的一个简单答案,我很抱歉,但我正在尝试获取一个 StructuredQueryDefinition 对象,该对象将搜索包含特定 XML 元素的文档。
我可能使用的 XML 搜索字符串如下所示:
<query xmlns="http://marklogic.com/appservices/search">
<container-query>
<element ns="" name="MyTag" />
<true-query/>
</container-query>
</query>
但我不确定如何使用 Java API 创建 StructuredQueryDefinition。 我正在寻找相当于
<true-query/>
的内容,但我没有看到。
StructuredQueryBuilder qb = …
StructuredQueryDefinition def = qb.containerQuery(qb.element("MyTag"), ?whatGoesHere?);
我确实发现了一个丑陋的黑客,它允许我创建自己的
<true-query/>
StructuredQueryDefinition,但它并不漂亮。 我希望有一种更“开箱即用”的方式来限制具有给定标签的 XML 文件,但同时我将使用此类:
package com.marklogic.client.query;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
/**
* This is a pretty gritty hack. I needed to create a StructuredQueryDefinition that
* would represent the <true-query/> search. (This was needed to find XML files that
* contain a given element).
*
* The StructuredQueryBuilder has a checkQuery method that only allows StructuredQueryDefinition
* objects that are assignable from the AbstractStructuredQuery class. Unfortunatly this
* class is protected so I can't extend it from any class that isn't in the com.marklogic.client.query
* package. Additionally the AbstractStructuredQuery default constructor references the builderOptionsURI
* of its enclosing class StructuredQueryBuilder so I had to first create a class that extended
* the StructuredQueryBuilder and that class define an inner class that extends the AbstractStructuredQuery
* class.
*
* Its not pretty but it does work. I can create a StructuredQueryDefinition to limit to
* document containing a tag using the following
* qb.containerQuery(
* qb.element(tag),
* new com.marklogic.client.query.StructuredQueryBuilderExt().getTrueQueryDefinition()
* );
*/
public class StructuredQueryBuilderExt extends StructuredQueryBuilder {
public TrueQueryDefinition getTrueQueryDefinition() {
return new TrueQueryDefinition();
}
public class TrueQueryDefinition extends AbstractStructuredQuery {
@Override
public void innerSerialize(XMLStreamWriter serializer) throws XMLStreamException {
serializer.writeEmptyElement("true-query");
}
}
}
不幸的是,
true-query
和false-query
函数似乎尚未在StructuredQueryBuilder中实现和公开。
我将提交一个错误来实现这些功能,但与此同时,您可能需要利用您的自定义扩展。