使用MarkLogic java客户端api迭代结果

使用MarkLogic java客户端api迭代结果,marklogic,Marklogic,我有一个XML,有多个节点 使用参数编写查询选项并将其保存到数据库 <search:options xmlns:search="http://marklogic.com/appservices/search"> <search:constraint name="extValue"> <search:value> <search:element ns="urn:hl7-org:v2xml" name="CX.1

我有一个XML,有多个节点

使用参数编写查询选项并将其保存到数据库

<search:options xmlns:search="http://marklogic.com/appservices/search">
  <search:constraint name="extValue">
        <search:value>
            <search:element ns="urn:hl7-org:v2xml"  name="CX.1" />
        </search:value>
  </search:constraint>
  <search:extract-document-data xmlns="urn:hl7-org:v2xml"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="urn:hl7-org:v2xml ADT_A01.xsd">
      <search:extract-path>/ADT_A01/PID/PID.3/CX.4/HD.1</search:extract-path>
      <search:extract-path>/ADT_A01/PV1/PV1.7/XCN.2/FN.1</search:extract-path>
      <search:extract-path>/ADT_A01/PV1/PV1.7/XCN.3</search:extract-path>
      <search:extract-path>/ADT_A01/PV1/PV1.4/CWE.1</search:extract-path>
      </search:extract-document-data>
  </search:options>
数据库的结果提取了如下内容

<search:extracted>
    <HD.1 xmlns="urn:hl7-org:v2xml">ABC</HD.1>
    <CWE.1 xmlns="urn:hl7-org:v2xml">E</CWE.1>
    <FN.1 xmlns="urn:hl7-org:v2xml">Sri</FN.1>
    <XCN.3 xmlns="urn:hl7-org:v2xml">N</XCN.3>
</search:extracted>

基础知识
E
斯里兰卡
N
我的目标是检索并填充JavaPOJO。
是否有其他方法可以直接将结果映射到POJO?

最简单的方法是使用MarkLogic 8中引入的POJO facade:

另一种方法是使用JAXBHandle并为查询读取多个文档:


希望这能有所帮助,

对于我的答案,我假设您希望保留保留的文档原样。我相信您有两种选择可以直接检索到POJO:

  • 将结果转换为适用于JAXBHandle的XML或适用于JacksonDatabindHandle的JSON
  • 使用selected=“include with祖先”并为POJO建模以适应XML结构
  • 第一种方法需要安装REST转换,如中所示。 我在这里演示第二种方法。为了举例,我简化了您的XML。我将把它作为一个练习留给您使用JAXB ninja技能来配置映射到XML的POJO,或者使用SearchResponseTransform.java中的技术将结果转换为类似本例的简单内容

    下面是我将插入数据库的XML。它基于您的,但简化了:

    <ADT_A01 xmlns='urn:hl7-org:v2xml'>
        <CX.1>1.32022.1.10.2</CX.1>
        <HD.1>ABC</HD.1>
        <FN.1>Sri</FN.1>
        <XCN.3>N</XCN.3>
        <CWE.1>E</CWE.1>
    </ADT_A01>
    
    下面是代码的其余部分(另存为JAXBExtract.java)

    导入com.marklogic.client.DatabaseClient;
    导入com.marklogic.client.DatabaseClientFactory;
    导入静态com.marklogic.client.DatabaseClientFactory.Authentication.DIGEST;
    导入com.marklogic.client.document.XMLDocumentManager;
    导入com.marklogic.client.query.QueryManager;
    导入com.marklogic.client.query.StructuredQueryBuilder;
    导入com.marklogic.client.query.StructuredQueryDefinition;
    导入com.marklogic.client.query.RawCombinedQueryDefinition;
    导入com.marklogic.client.query.MatchDocumentSummary;
    导入com.marklogic.client.query.ExtractedItem;
    导入com.marklogic.client.query.ExtractedResult;
    导入com.marklogic.client.io.SearchHandle;
    导入com.marklogic.client.io.StringHandle;
    导入com.marklogic.client.io.Format;
    导入com.marklogic.client.io.JAXBHandle;
    导入javax.xml.bind.JAXBContext;
    公共类JAXBExtract{
    私有静态DatabaseClient=DatabaseClientFactory.newClient(
    “本地主机”,8000,“管理员”,“管理员”,摘要);
    私有静态XMLDocumentManager docMgr=
    client.newXMLDocumentManager();
    公共静态void main(字符串[]args)引发异常{
    字符串xml=
    "" +
    "1.32022.1.10.2" +
    “ABC”+
    “斯里兰卡”+
    “N”+
    “E”+
    "";
    String docId=“JAXBTransform_doc1.xml”;
    docMgr.writeAs(docId,xml);
    字符串选项=
    "" +
    "" +
    "" +
    "" +
    "" +
    "" +
    "" +
    “//HD.1”+
    “//FN.1”+
    “//XCN.3”+
    “//CWE.1”+
    "" +
    "";
    QueryManager queryMgr=client.newQueryManager();
    StructuredQueryBuilder qb=新StructuredQueryBuilder();
    结构querydefinition querydef=
    和(qb.valueConstraint(“extValue”,“1.32022.1.10.2”));
    //通常你会在服务器上安装你的选项,我只是这样做
    //RawCombinedQueryDefinition从示例中删除安装步骤
    RawCombinedQueryDefinition rawQuery=queryMgr.newRawCombinedQueryDefinition(
    新弦柄(
    "" +
    querydef.serialize()+
    选择权+
    “”)。withFormat(Format.XML));
    SearchHandle resultsHandle=queryMgr.search(rawQuery,newsearchHandle());
    MatchDocumentSummary[]summaries=resultsHandle.getMatchResults();
    //如果要使用getAs,只需注册ADT_A01.class
    //看http://www.marklogic.com/blog/io-shortcut-marklogic-java-client-api/
    DatabaseClientFactory.GetHandlerRegistry().register(
    JAXBHandle.newFactory(ADT_A01.class)
    );
    用于(匹配文档摘要:摘要){
    ExtractedResult extracted=summary.getExtracted();
    if(Format.XML==summary.getFormat()){
    ExtractedItem=extracted.next();
    //因为我通过JAXBHandle注册了ADT_A01.class,所以使用了它
    //在幕后马歇尔的对象
    ADT_A01 myObj=项目.getAs(ADT_A01.class);
    System.out.println(“myObj=[“+myObj+”]);
    System.out.println(“提取的xml=[”+item.getAs(String.class)+“]);
    }
    }
    client.newXMLDocumentManager().delete(docId);
    }
    }
    
    这里的问题是,我从xml的多个XPath提取数据。因此,我不能直接将pojo映射到xml。在这些链接中,我没有看到任何可以将ExtractedResult对象转换为POJO或提取结果响应并转换为POJO的示例。使用extract的一个替代方法是使用JAXB序列化POJO,以发现JAXB可以将哪些XML作为输入。然后,编写从源文档到JAXB输入XML的转换,并将其安装到服务器上。然后,在客户端上,您可以使用JAXBHandle为一个查询读取多个文档,在服务器上转换文档。。我有一个由一个后台进程持久化的源XML。现在,我需要从源代码中通过XPath转换检索一些元素值,比如我在sourceXML中提取20个元素的5个值,并在UI中显示它。稍后,如果业务部门要求在摘录中添加一个以上字段
    <ADT_A01 xmlns='urn:hl7-org:v2xml'>
        <CX.1>1.32022.1.10.2</CX.1>
        <HD.1>ABC</HD.1>
        <FN.1>Sri</FN.1>
        <XCN.3>N</XCN.3>
        <CWE.1>E</CWE.1>
    </ADT_A01>
    
    <search:extracted kind="element">
        <ADT_A01 xmlns="urn:hl7-org:v2xml">
            <HD.1>ABC</HD.1><FN.1>Sri</FN.1><XCN.3>N</XCN.3><CWE.1>E</CWE.1>
        </ADT_A01>
    </search:extracted>
    
    @XmlRootElement(name="ADT_A01", namespace="urn:hl7-org:v2xml")
    public class ADT_A01 {
        @XmlElement(name="HD.1")
        public String HD_1;
        @XmlElement(name="FN.1")
        public String FN_1;
        @XmlElement(name="XCN.3")
        public String XCN_3;
        @XmlElement(name="CWE.1")
        public String CWE_1;
    
        public String toString() {
            return "HD_1=[" + HD_1 + "] FN_1=[" + FN_1 + "] XCN_3=[" +
                XCN_3 + "] CWE_1=[" + CWE_1 + "]";
        }
    }
    
    import com.marklogic.client.DatabaseClient;
    import com.marklogic.client.DatabaseClientFactory;
    import static com.marklogic.client.DatabaseClientFactory.Authentication.DIGEST;
    import com.marklogic.client.document.XMLDocumentManager;
    import com.marklogic.client.query.QueryManager;
    import com.marklogic.client.query.StructuredQueryBuilder;
    import com.marklogic.client.query.StructuredQueryDefinition;
    import com.marklogic.client.query.RawCombinedQueryDefinition;
    import com.marklogic.client.query.MatchDocumentSummary;
    import com.marklogic.client.query.ExtractedItem;
    import com.marklogic.client.query.ExtractedResult;
    import com.marklogic.client.io.SearchHandle;
    import com.marklogic.client.io.StringHandle;
    import com.marklogic.client.io.Format;
    import com.marklogic.client.io.JAXBHandle;
    import javax.xml.bind.JAXBContext;
    
    public class JAXBExtract {
        private static DatabaseClient client = DatabaseClientFactory.newClient(
            "localhost", 8000, "admin", "admin", DIGEST);
        private static XMLDocumentManager docMgr =
            client.newXMLDocumentManager();
    
        public static void main(String[] args) throws Exception {
            String xml =
                "<ADT_A01 xmlns='urn:hl7-org:v2xml'>" +
                    "<CX.1>1.32022.1.10.2</CX.1>" +
                    "<HD.1>ABC</HD.1>" +
                    "<FN.1>Sri</FN.1>" +
                    "<XCN.3>N</XCN.3>" +
                    "<CWE.1>E</CWE.1>" +
                "</ADT_A01>";
            String docId = "JAXBTransform_doc1.xml";
            docMgr.writeAs(docId, xml);
            String options =
                "<search:options>" +
                    "<search:constraint name='extValue'>" +
                        "<search:value>" +
                            "<search:element ns='urn:hl7-org:v2xml'  name='CX.1' />" +
                        "</search:value>" +
                    "</search:constraint>" +
                    "<search:extract-document-data selected='include-with-ancestors' " +
                        "xmlns='urn:hl7-org:v2xml'>" +
                        "<search:extract-path>//HD.1</search:extract-path>" +
                        "<search:extract-path>//FN.1</search:extract-path>" +
                        "<search:extract-path>//XCN.3</search:extract-path>" +
                        "<search:extract-path>//CWE.1</search:extract-path>" +
                    "</search:extract-document-data>" +
                "</search:options>";
            QueryManager queryMgr = client.newQueryManager();
            StructuredQueryBuilder qb = new StructuredQueryBuilder();
            StructuredQueryDefinition querydef =
                    qb.and(qb.valueConstraint("extValue", "1.32022.1.10.2"));
            // normally you'd install your options on the server, I'm just doing
            // RawCombinedQueryDefinition to remove the installation step from my example
            RawCombinedQueryDefinition rawQuery = queryMgr.newRawCombinedQueryDefinition(
                new StringHandle(
                    "<search:search xmlns:search='http://marklogic.com/appservices/search'>" +
                        querydef.serialize() +
                        options +
                    "</search:search>").withFormat(Format.XML));
            SearchHandle resultsHandle = queryMgr.search(rawQuery, new SearchHandle());
            MatchDocumentSummary[] summaries = resultsHandle.getMatchResults();
            // you only have to register ADT_A01.class if you want to use getAs
            // see http://www.marklogic.com/blog/io-shortcut-marklogic-java-client-api/
            DatabaseClientFactory.getHandleRegistry().register(
                JAXBHandle.newFactory(ADT_A01.class)
            );
            for (MatchDocumentSummary summary : summaries) {
                ExtractedResult extracted = summary.getExtracted();
                if (Format.XML == summary.getFormat()) {
                    ExtractedItem item = extracted.next();
                    // since I registered ADT_A01.class via JAXBHandle, it is used
                    // behind the scenes to marshall the object
                    ADT_A01 myObj = item.getAs(ADT_A01.class);
                    System.out.println("myObj=[" + myObj + "]");
                    System.out.println("extracted xml=[" + item.getAs(String.class) + "]");
                }
            }
            client.newXMLDocumentManager().delete(docId);
        }
    }