2015-10-27 3 views
5

Я пытаюсь вернуть XML-документ в формате JSON с помощью приложения с двумя уровнями на стороне сервера javascript. Я знаю, что MarkLogic может легко переключаться между форматами JSON и XML, используя REST api.Как получить результаты json из XML-документа в marklogic

Однако следующие возвращает XML:

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

, но это ничего не возвращает:

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

Согласно документации, я думаю, что я использовал функцию правильно.

Возможно ли это, используя серверную часть javascript?

Update:

Использование transformToJsonObject следующим образом:

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

Я получаю следующее сообщение об ошибке:

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 

ответ

5

В format-xml и опции в cts.search() фильтр результатов поиска по тем форматы; они не делают никаких преобразований (см. cts.search() options documentation).

Существует много способов преобразования XML в JSON с использованием MarkLogic; наиболее простым является, вероятно, json XQuery library, в частности json:transform-to-json-object(). Вы можете использовать эту библиотеку в стороне сервера JS, как это:

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

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

Вы можете использовать json.config() для настройки и настроить преобразование.

cts.search() возвращает Iterator, поэтому вам понадобится цикл for-of (или какая-либо функция аккумулятора), чтобы получить фактические документы XML, которые затем можно преобразовать.

Update:

Эта ошибка может быть ошибка в библиотеке JSON, но это очень глубокий HTML путь; и я не думаю, что имеет смысл преобразовать элементы HTML в свойства объекта JSON. Вместо этого мы будем сериализовать HTML-код и добавить строку обратно к нашему объекту JSON.

Вот пример преобразования результатов поиска; показывая, как разворачивать Iterator, настроить JSON преобразования, сериализовать содержимое XHTML для использования в JSON и т.д.

Примечания:

  • это использует fn.subsequence ограничить Iterator первые 10 результатов.
  • Я серизую исключенные элементы <html/> в строку (используя xpath() method of the Node object и xdmp.quote() и добавляя это к объекту JSON как escapedContent.

Вот комбинированный пример; вы можете запустить это в 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

Спасибо, что ответили! Я пробовал, но пока не работает для меня. Как ни странно, я продолжаю получать ошибку XDMP: STACKOVERFLOW. Скорее всего, это связано с моими данными. Я буду продолжать пытаться, и если я получу его работу, я соглашусь. – chriskelly

+0

Можете ли вы обновить свой ответ и опубликовать полное сообщение об ошибке? Кроме того, я обновил свой ответ с помощью примера поиска. – joemfb

+0

Я обновил ответ с ошибкой. FYI, документ xml содержит одного ребенка, который имеет «аккуратный» html в теле. – chriskelly

Смежные вопросы