2016-05-03 8 views
4

Ich möchte mit einigen Dokumenteigenschaften (die in XML sind) als Knoten arbeiten, so dass ich mit untergeordneten Elementen arbeiten kann. Bisher habe ich:wie Objekte in Knoten zu konvertieren

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 

I nodebuilder Beispiele in der Dokumentation Marklogic gesehen habe, und ich möchte, dass die Schnittstelle verwenden. z.B.

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

Statt Auswertung XPath ist es eine Möglichkeit, ich das Objekt in einen Knoten zu konvertieren? Gibt es alternativ eine bessere Möglichkeit, mit vorhandenem XML im Server Side JavaScript zu arbeiten?

In XQuery kann ich xdmp:tranform-to-json() verwenden, aber diese Funktion wird nicht in SJS zur Verfügung gestellt.

EDIT:

In meinem Versuch, das ein sauberes Codebeispiel I zu erhalten, wichtige Informationen weggelassen. Ich hatte meinen Code wie folgt strukturiert:

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

anstelle von

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

Der zurück Typ ist ein ValueIterator welche Äquivalent eines XQuery-Sequenz und kann mit zugegriffen werden:

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

Opinion-based: Ich analysiere immer meine XML zu JSON vor jeder Logik. Das Leben ist viel einfacher, wenn Sie nicht gerne mit XML arbeiten. – Shilly

+0

@Shilly: Meinst du in der Datenbank oder wenn Sie über ein XML-Element iterieren? Wie konvertierst du dein XML in Javascript in JSON? – chriskelly

+0

Wenn ich die Daten vom Server empfange, bevor ich sie benutze. Bei komplexen XML-Dokumenten überstreiche ich einfach alle untergeordneten Knoten und speichere die Werte in verschachtelten Objekten. Für einfaches XML analysiere ich einfach die relevanten Daten mit einer Regex. (nicht für nicht-einfache xml beraten) Oder werfen Sie einen Blick auf die Plugins für Ihr Framework. Fast alle von ihnen haben heutzutage einige xml und json utils. – Shilly

Antwort

7

Diese arbeitete für mich in QConsole:

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

In meinem Test war jeder p ein Knoten. Ich habe einige Beispieldaten mit einem xquery-Skript erstellt.