2015-07-08 2 views
2

У меня есть XML, с несколькими узламиперебор результатов с использованием MarkLogic Java клиентом API

Выписали параметры запроса с параметром и сохранить его в базу данных

<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> 

извлекаемых результатов

DatabaseClient client = factory.getSuperMLConnection(); 
QueryManager queryMgr = client.newQueryManager(); 
//used the query options above which is saved to DB with name v2searchQueryOpts 
StructuredQueryBuilder qb = new StructuredQueryBuilder("v2searchQueryOpts"); 
//this is one of the element value in the xml 
StructuredQueryDefinition querydef = 
     qb.and(qb.valueConstraint("extValue", "1.32022.1.10.2")); 
SearchHandle resultsHandle = queryMgr.search(querydef, new SearchHandle()); 
MatchDocumentSummary[] summaries = resultsHandle.getMatchResults(); 
// here is where i am concerned. 
for (MatchDocumentSummary summary : summaries) { 
    ExtractedResult extracted = summary.getExtracted(); 
    if (Format.XML == summary.getFormat()) { 
     Document facility = extracted.next().getAs(Document.class); 
     Document status = extracted.next().getAs(Document.class); 
     Document physicianFirstName = extracted.next().getAs(Document.class); 
     Document physicianLastName = extracted.next().getAs(Document.class); 
     System.out.println("status is :: " + status.getFirstChild().getTextContent()); 
     System.out.println("facility is :: " + facility.getFirstChild().getTextContent()); 
     System.out.println("physicianFirstName is :: " + physicianFirstName.getFirstChild().getTextContent()); 
     System.out.println("physicianLastName is :: " + physicianLastName.getFirstChild().getTextContent()); 
    } 
    } 
} 

В результате из базы данных был извлечен контент ниже

<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> 

Моя цель - загрузить и заполнить java POJO. Есть ли какой-либо другой способ, я могу напрямую отобразить свой результат в POJO?

ответ

2

Самый простой подход заключается в использовании POJO фасад введенный в MarkLogic 8:

http://docs.marklogic.com/guide/java/binding

Альтернативой является использование JAXBHandle и прочитать несколько документов для запроса:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/io/JAXBHandle.html http://docs.marklogic.com/guide/java/bulk#id_37758

Надевание, что помогает,

+0

Проблема заключается в том, что я извлекаю данные из нескольких xpaths xml. Так что я не могу напрямую сопоставить pojo с xml. и я не вижу каких-либо примеров в тех ссылках, где я могу преобразовать объект ExtractedResult в POJO или извлечь ответ на результат и преобразовать его в POJO – venkata

+0

. Одной из альтернативных вариантов использования будет использование JAXB для сериализации вашего POJO, чтобы узнать, что XML JAXB может принимать как вход. Затем напишите преобразование из исходного документа в XML-вход JAXB и установите его на сервере. На клиенте вы можете использовать JAXBHandle для чтения нескольких документов для запроса, преобразования документов на сервере. – ehennum

+0

Чтобы подробно описать мой сценарий ... У меня есть исходный XML, который сохраняется в одном из фоновых процессов. Теперь мне нужно получить некоторые значения элементов с помощью переводов XPath из Source, Скажите, что я извлекаю 5 значений из 20 элементов в sourceXML и покажу их в пользовательском интерфейсе. Позже, если бизнес попросит добавить еще одно поле к извлечению и сделать 6 значений, отображаемых в пользовательском интерфейсе, мне нужно будет добавить это. Я понимаю, что вышеупомянутое решение не будет масштабируемо для этого сценария. Если мне что-то не хватает, было бы очень полезно, если вы сможете подробно описать подход к дизайну, который я должен принять. – venkata

1

Для моего ответа я предполагаю, что вы хотите оставить сохраненные документы как есть. Я считаю, что у вас есть два варианта, чтобы получить эти непосредственно к POJO:

  1. преобразования результатов в XML, подходящий для JAXBHandle или JSON, подходящих для JacksonDatabindHandle
  2. использования выбранного = «включает в себя-с-предками» и модели вашей POJO-х для соответствия вашей XML-структуре

Первый подход требует установки преобразования REST, которое показано в SearchResponseTransform.java. Я демонстрирую здесь второй подход. Для примера я упростил ваш XML. Я оставлю это как упражнение для использования вами навыков ниндзя JAXB для настройки карты POJO на ваш XML или использования метода из SearchResponseTransform.java, чтобы преобразовать результаты в нечто простое, как в этом примере.

Вот XML, который я буду вставлять в db. Он основан на ваших, но упрощена:

<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> 

Параметры поиска Я буду использовать почти такие же, как у вас, кроме меня упростили пути, чтобы соответствовать образцу XML, и я добавил выбран = "включает в себя-с-предками «, который является ключом к получению одной структуры XML, содержащей все извлеченные элементы. Пользуясь этим, я вернусь это в результатах:

<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> 

Вот цель POJO (сохранить как ADT_A01.java): импорт javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlElement;

@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 + "]"; 
    } 
} 

И вот остальная часть кода (сохранить как JAXBExtract.java)

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); 
    } 
} 
Смежные вопросы