You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MarkLogic Java API查询单个XML元素关联的多值数据

没问题!我帮你梳理下怎么用MarkLogic Java API实现单个XML元素关联多值的查询,结合你的文档结构来给你具体代码示例~

首先先补全你的XML文档结构(方便后续理解):

datatypename1 datatype1 code1 value1 code2 value2 code3 value3

场景1:查询包含指定多值的文档

比如你要找所有包含<code>为code1 或 code2的文档,或者同时包含这两个值的文档,代码如下:

1. 初始化MarkLogic客户端

// 替换成你的MarkLogic服务地址、端口和认证信息
DatabaseClient client = DatabaseClientFactory.newClient(
    "localhost", 
    8000, 
    new DatabaseClientFactory.DigestAuthContext("your-username", "your-password")
);

2. 构建多值查询

用StructuredQueryBuilder来构建查询条件,支持或逻辑(匹配任意一个值)和与逻辑(同时匹配所有值):

QueryManager queryManager = client.newQueryManager();
StructuredQueryBuilder qb = new StructuredQueryBuilder();

// 示例1:匹配<code>为code1 或 code2的文档
StructuredQueryDefinition orQuery = qb.or(
    qb.value(qb.element("code"), "code1"),
    qb.value(qb.element("code"), "code2")
);

// 示例2:匹配同时包含<code>为code1 和 code2的文档
// StructuredQueryDefinition andQuery = qb.and(
//     qb.value(qb.element("code"), "code1"),
//     qb.value(qb.element("code"), "code2")
// );

3. 执行查询并处理结果

// 执行查询,用SearchHandle接收结果
SearchHandle resultsHandle = queryManager.search(orQuery, new SearchHandle());

// 遍历匹配的文档,提取对应的datavalue
XMLDocumentManager docManager = client.newXMLDocumentManager();
for (MatchDocumentSummary summary : resultsHandle.getMatchResults()) {
    DOMHandle contentHandle = new DOMHandle();
    docManager.read(summary.getUri(), contentHandle);
    
    // 提取当前文档的所有datavalue元素
    NodeList datavalueNodes = contentHandle.get().getElementsByTagName("datavalue");
    for (int i = 0; i < datavalueNodes.getLength(); i++) {
        Element datavalue = (Element) datavalueNodes.item(i);
        String code = datavalue.getElementsByTagName("code").item(0).getTextContent();
        String value = datavalue.getElementsByTagName("value").item(0).getTextContent();
        System.out.printf("找到匹配项:Code=%s, Value=%s%n", code, value);
    }
}

// 记得关闭客户端
client.release();

场景2:根据单个键获取关联的所有多值

比如你要根据<datatypename>的值(比如datatypename1),查询对应的所有<datavalue>(也就是单个键关联的多值集合),代码核心部分如下:

// 构建查询:匹配datatypename为datatypename1的文档
StructuredQueryDefinition query = qb.value(
    qb.element("datatypename"), 
    "datatypename1"
);

// 执行查询后,提取该文档的所有datavalue,这就是该键对应的多值集合
SearchHandle resultsHandle = queryManager.search(query, new SearchHandle());
if (resultsHandle.getTotalResults() > 0) {
    MatchDocumentSummary firstMatch = resultsHandle.getMatchResults()[0];
    DOMHandle contentHandle = new DOMHandle();
    docManager.read(firstMatch.getUri(), contentHandle);
    
    // 提取所有datavalue并输出
    NodeList datavalueNodes = contentHandle.get().getElementsByTagName("datavalue");
    System.out.println("datatypename1对应的所有值:");
    for (int i = 0; i < datavalueNodes.getLength(); i++) {
        Element datavalue = (Element) datavalueNodes.item(i);
        String code = datavalue.getElementsByTagName("code").item(0).getTextContent();
        String value = datavalue.getElementsByTagName("value").item(0).getTextContent();
        System.out.printf("- Code: %s, Value: %s%n", code, value);
    }
}

关键注意事项

为了让查询更高效,建议在MarkLogic管理控制台给<code>、<datatypename>这些需要查询的元素配置元素值索引:

  1. 进入MarkLogic管理控制台 → 数据库 → 你的数据库 → 索引
  2. 添加元素值索引,指定元素名(比如code、datatypename),选择对应的数据类型(比如字符串)

这样MarkLogic会提前建立索引,大幅提升多值查询的性能。

内容的提问来源于stack exchange,提问作者marklogic_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:07:58