2015-10-27 13 views
5

Sto cercando di restituire un documento XML in formato JSON utilizzando un'applicazione javascript lato server a 2 livelli. So che MarkLogic può passare facilmente tra i formati JSON e XML utilizzando l'API REST.come ottenere risultati json dal documento xml in marklogic

Tuttavia, i seguenti rendimenti xml:

cts.search('something', ['format-xml']) // options may be omitted 

ma questo non restituisce nulla:

cts.search('something', ['format-json']) 

Secondo la documentazione credo di aver utilizzato la funzione correttamente.

È possibile utilizzare javascript lato server?

Aggiornamento:

Utilizzando transformToJsonObject come segue:

var json = require('/MarkLogic/json/json.xqy'); 
var doc = fn.doc('/content/rss/72eb9bf835521446be8d2176e1ac9d22.xml') 
var jsonDoc = json.transformToJsonObject(doc, json.config('custom')); 
jsonDoc 

ottengo il seguente errore:

500 Internal Server Error 

XDMP-STACKOVERFLOW: Stack overflow 
in /MarkLogic/json/custom.xqy, at 493:23, 
in json-custom:is-ignore-attribute#2(json:object(<json:object xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://marklogic.com/xdmp/json"><json:entry key="element-qname-from-json-name"><json:value xsi:t...</json:object>...XDMP-ATOMIZEFUNC: (err:FOTY0013) Functions cannot be atomized...), fn:doc("/content/rss/72eb9bf835521446be8d2176e1ac9d22.xml")/newsitem/article/*:html/*:head/*:script[5]/*:script/*:script/*:script/*:link/*:script/*:script/*:script/*:script/*:script/*:script/*:style/*:script/*:script/*:script/*:script/*:script/*:script/*:script/*:script/*:script/*:script/*:link/*:script/*:script/*:noscript/*:link/*:meta/*:body/*:div/*:div/*:div/*:script/*:div/*:div/*:script/*:script/*:div/*:div/*:script/*:script/*:script/*:script/*:noscript/*:p/*:header/*:div/*:div/*:div/*:a/*:section/*:div/*:h2/*:ul/*:li/*:a/*:li/*:a/*:div/*:div/*:a/*:img/*:span/*:script/*:nav/*:div/*:h2/*:ul/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:li/*:a/*:span/*:div/*:a/*:form/*:div/*:label/*:div/*:script/*:div/*:div/*:div/*:div/*:div/*:a/*:svg/*:title/*:h2/*:a/*:div/*:button/*:div/*:ul/*:li/*:a/*:span/*:li/*:a/*:span/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:div/*:nav/*:a/*:span/*:span/*:ul/*:li/*:a/*:span/*:li/*:a/*:span/*:span/*:div/*:div/*:script/*:script/*:div/*:div/*:span/*:span/*:a/*:div/*:div/*:script/*:script/*:div/*:div/*:div/*:span/*:span/*:a/*:div/*:div/*:script/*:script/*:div/*:div/*:div/*:div/*:h1/*:div/*:ul/*:li/*:div/*:li/*:span/*:a/*:div/*:figure/*:span/*:img/*:span/*:span/*:figcaption/*:span/*:span/*:p/*:p/*:p/*:p/*:p/*:div/*:div/*:script/*:script/*:h2/*:p/*:p/*:figure/*:span/*:div/*:span/*:span/*:figcaption/*:span/*:span/*:p/*:p/*:p/*:p/*:p/*:p/*:p/*:p/*:div/*:a/*:h2/*:a/*:ul/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:li/*:a/*:span/*:div/*:div/*:div/*:h2/*:div/*:ul/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:li/*:a/*:div/*:div/*:div/*:span/*:div/*:div/*:div/*:div/*:div/*:h2/*:div/*:ul/*:li/*:div/*:div/*:a/*:div/*:span/*:p/*:div/*:div/*:div/*:div/*:script/*:script/*:div/*:div/*:script/*:script/*:div/*:div/*:script/*:script/*:div/*:div/*:h2/*:a/*:strong/*:p/*:div/*:a/*:strong/*:div/*:a/*:strong/*:div/*:div/*:div/*:script/*:script/*:div/*:div/*:h2/*:div/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:h3/*:p/*:div/*:a/*:div/*:div/*:div/*:div/*:div/*:span/*:span/*:span/*:h3/@class) [1.0-ml] 
$config = json:object(<json:object xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://marklogic.com/xdmp/json"><json:entry key="element-qname-from-json-name"><json:value xsi:t...</json:object>...XDMP-ATOMIZEFUNC: (err:FOTY0013) Functions cannot be atomized...) 
$a = fn:doc("/content/rss/72eb9bf835521446be8d2176e1ac9d22.xml")/newsitem/article/*:html/*:head/*:script[5]/*:script/*:script/*:script/*:link/*:script/*:script/*:script/*:script/*:script/*:script/*:style/*:script/*:script/*:script/*:script/*:scr 

risposta

5

I format-xml e opzioni per cts.search() filtrare i risultati della ricerca da parte di coloro formati; non eseguono alcuna trasformazione (vedere lo cts.search() options documentation).

Ci sono molti modi per trasformare XML in JSON usando MarkLogic; il più semplice è probabilmente lo json XQuery library, in particolare lo json:transform-to-json-object(). È possibile utilizzare tale libreria nel lato server JS come questo:

var json = require('/MarkLogic/json/json.xqy'); 

var doc = cts.doc('/triplestore/97a5ab126bddeea0.xml'); 
var jsonDoc = json.transformToJsonObject(doc, json.config('custom')); 

È possibile utilizzare json.config() per configurare e personalizzare la trasformazione.

cts.search() restituisce un Iterator, quindi è necessario un ciclo for-of (o qualche tipo di funzione di accumulatore) per ottenere i documenti XML effettivi, che è possibile trasformare.

Aggiornamento:

Tale errore potrebbe essere un bug nella libreria JSON, ma questo è un percorso HTML molto profondo; e non penso che abbia molto senso trasformare elementi HTML in proprietà dell'oggetto JSON. Invece, serializzeremo l'HTML e aggiungeremo la stringa al nostro oggetto JSON.

Ecco un esempio di trasformazione dei risultati di ricerca; mostrando come per aprire il Iterator, personalizzare le trasformazioni JSON, serializzare il contenuto XHTML per l'utilizzo in JSON, ecc

Note:

  • Questo utilizza fn.subsequence per limitare la Iterator ai primi 10 risultati.
  • Sto serializzando gli elementi <html/> esclusi in una stringa (utilizzando xpath() method of the Node object e xdmp.quote() e aggiungendoli all'oggetto JSON come escapedContent.

Ecco l'esempio combinato; puoi eseguirlo in MarkLogic QConsole:

var json = require('/MarkLogic/json/json.xqy'); 
var conf = json.config('custom'); 

var htmlNs = 'http://www.w3.org/1999/xhtml'; 

// exclude <html:html/> elements 

// Note: this is a little awkward because the JSON library is XQuery 
// and requires an XDM sequence, not an Array 
conf['ignore-element-names'] = json.arrayValues([ 
    fn.QName(htmlNs, 'html') 
]); 

var results = fn.subsequence(
    cts.search(cts.andQuery(null), 'format-xml'), 
    1, 
    10 
); 

var transformedResults = []; 
var transformed = []; 

for (var result of results) { 
    // transformToJson() returns an object-node() wrapped in a document-node() 
    // convert it to a regular JS object 
    transformed = json.transformToJson(result, conf).toObject() 

    transformed.escapedContent = xdmp.quote(
    result.xpath('.//html:html', { html: htmlNs}) 
); 

    transformedResults.push(transformed); 
} 

transformedResults 
+0

Grazie per aver risposto! Ho provato ma non funziona ancora per me. Stranamente, continuo a ricevere un errore XDMP: STACKOVERFLOW. Probabilmente ha qualcosa a che fare con i miei dati. Continuerò a provare e se lo farò funzionare accetterò. – chriskelly

+0

Puoi aggiornare la tua risposta e pubblicare il messaggio di errore completo? Inoltre, ho aggiornato la mia risposta con un esempio di iterazione di ricerca. – joemfb

+0

Ho aggiornato la risposta con l'errore. Cordiali saluti, Il documento xml contiene un bambino che ha "tidy" html nel corpo. – chriskelly

Problemi correlati