使用 Marklogic Java API 创建 StructuredQueryDefinition 以查找具有给定元素的所有 XML 文件

问题描述 投票:0回答:1

如果我错过了这个问题的一个简单答案,我很抱歉,但我正在尝试获取一个 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");
        }
    }
}
java marklogic
1个回答
0
投票

不幸的是,

true-query
false-query
函数似乎尚未在StructuredQueryBuilder中实现和公开。

我将提交一个错误来实现这些功能,但与此同时,您可能需要利用您的自定义扩展。

© www.soinside.com 2019 - 2024. All rights reserved.