2015-10-27 5 views
5

Ich versuche, ein XML-Dokument im JSON-Format mit einer 2-Tier-Server-Seite Javascript-Anwendung zurückgeben. Ich weiß, dass MarkLogic mit der REST API leicht zwischen JSON- und XML-Formaten wechseln kann.Wie bekomme ich Json Ergebnisse von XML-Dokument in Marklogic

jedoch die folgenden Renditen xml:

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

aber dies gibt nichts zurück:

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

Nach der Dokumentation Ich glaube, ich die Funktion richtig verwendet habe.

Ist dies mit serverseitigem Javascript möglich?

Update:

Mit transformToJsonObject wie folgt:

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

Ich erhalte die folgende Fehlermeldung:

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 

Antwort

5

Die format-xml und Optionen cts.search() Filter die Suchergebnisse von denen, Formate; Sie führen keine Transformationen durch (siehe cts.search() options documentation).

Es gibt viele Möglichkeiten, XML mithilfe von MarkLogic in JSON umzuwandeln; die einfachste ist wahrscheinlich die json XQuery library, speziell json:transform-to-json-object(). Sie können diese Bibliothek in serverseitige JS wie folgt verwenden:

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

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

Sie json.config() verwenden können, um die Transformation zu konfigurieren und anpassen.

cts.search() gibt eine Iterator, so dass Sie eine for-of Schleife (oder eine Art von Akkumulatorfunktion) benötigen, um die tatsächlichen XML-Dokumente zu erhalten, die Sie dann transformieren können.

aktualisieren:

Dieser Fehler ein Fehler in der JSON-Bibliothek sein könnte, aber das ist ein sehr tiefer HTML Pfad; und ich glaube nicht, dass es viel Sinn macht, HTML-Elemente in JSON-Objekteigenschaften umzuwandeln. Stattdessen werden wir den HTML-Code serialisieren und den String wieder zu unserem JSON-Objekt hinzufügen.

Hier ist eine Beispielumwandlung der Suchergebnisse; das zeigt, wie die Iterator auszupacken, die JSON-Transformationen anpassen, XHTML-Inhalt für die Verwendung in JSON etc.

Hinweise serialisiert:

  • diese fn.subsequence verwendet die Iterator auf die ersten 10 Ergebnisse zu begrenzen.
  • Ich bin die ausgeschlossenen <html/>-Elemente in eine Zeichenfolge (mit den xpath() method of the Node object und xdmp.quote(), und das Hinzufügen zu dem JSON-Objekt als escapedContent.

Hier ist das kombinierte Beispiel; Sie können dies in Marklogic QConsole laufen:

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

Dank für die Beantwortung! Ich habe es versucht, funktioniert aber noch nicht für mich. Lustigerweise bekomme ich immer einen XDMP: STACKOVERFLOW Fehler. Es hat wahrscheinlich etwas mit meinen Daten zu tun. Ich werde es weiter versuchen und wenn es funktioniert, werde ich es akzeptieren. – chriskelly

+0

Können Sie Ihre Antwort aktualisieren und die vollständige Fehlermeldung posten? Außerdem habe ich meine Antwort mit einem Beispiel für eine Suchiteration aktualisiert. – joemfb

+0

Ich habe die Antwort mit dem Fehler aktualisiert. FYI, das XML-Dokument enthält ein Kind, das im Körper "ordentlich" html hat. – chriskelly