как преобразовать объекты в узлы

Я хотел бы работать с некоторыми свойствами документа (которые находятся в xml) как с узлами, чтобы я мог работать с дочерними элементами. Пока у меня есть:

var counts = [];
for (var p of xdmp.documentProperties(uris)) {
    var isANode = p instanceof Node; // false (actually true - see edit)

    var count = xdmp.xqueryEval('fn:count(' + p + '//data)')
    counts.push(count)
}
counts

Я видел примеры nodebuilder в документации MarkLogic и хотел бы использовать этот интерфейс. например

myNode.xpath('//data')
var children = myNode.childNodes()

Вместо оценки с использованием XPath есть ли способ преобразовать объект в узел? В качестве альтернативы, есть ли лучший способ работать с существующим XML в JavaScript на стороне сервера?

В XQuery я могу использовать xdmp:tranform-to-json(), но эта функция не предусмотрена в SJS.

ИЗМЕНИТЬ:

Пытаясь предоставить чистый образец кода, я упустил важную информацию. У меня был мой код, структурированный следующим образом:

for (var uri of cts.uriMatch('/pattern/*')) {
    var p = xdmp.documentProperties(uri);
    var isANode = p instanceof Node; // false
    // ...
}

вместо

for (var p of xdmp.documentProperties(cts.uriMatch('/pattern/*'))) {
    var isANode = p instanceof Node; // true
    // ...
}

Возвращаемый тип — это ValueIterator, который эквивалентен последовательности XQuery и может быть доступен с помощью:

xdmp.documentProperties(uri).next().value

person chriskelly    schedule 03.05.2016    source источник
comment
Основанный на мнении: я всегда анализирую свой xml в json, прежде чем выполнять какую-либо логику. Сделал жизнь намного проще, если вам не нравится работать с xml.   -  person Shilly    schedule 03.05.2016
comment
@Shilly: вы имеете в виду в базе данных или когда вы перебираете элемент XML? Как вы конвертируете свой XML в javascript в JSON?   -  person chriskelly    schedule 03.05.2016
comment
Когда я получаю данные с сервера, перед их использованием. Для сложных XML-документов я просто перебираю все дочерние узлы и сохраняю значения во вложенных объектах. Для простого xml я просто анализирую соответствующие данные с помощью регулярного выражения. (не рекомендуется для непростых xml) Или взгляните на плагины для вашего фреймворка. В наши дни почти у всех есть утилиты xml и json.   -  person Shilly    schedule 03.05.2016
comment
@Shilly: Это именно то, что я хотел бы выяснить: как перебрать все дочерние узлы. В моем примере это не узлы, но когда я их печатаю, это xml. то есть x instanceof Node === false. Я хочу преобразовать свои значения в узлы, чтобы иметь доступ к дочерним элементам.   -  person chriskelly    schedule 03.05.2016


Ответы (1)


Это сработало для меня в QConsole:

var uris = ['/test.xml', '/test2.xml'];
var counts = [];
for (var p of xdmp.documentProperties(uris)) {
    counts.push(fn.count(p.xpath('//data')))
}
counts

В моем тесте каждый p был Node. Я создал некоторые образцы данных с помощью скрипта xquery.

let $test-data := (
  <priority>
    <data>hello</data>
  </priority>,
  <status>
    <data>hi</data>
  </status>
)
return
(
  xdmp:document-set-properties("/test.xml", $test-data),
  xdmp:document-set-properties("/test2.xml", $test-data)
)
person paxtonhare    schedule 03.05.2016