2017-03-20 2 views
0

Ich habe Schwierigkeiten, XML in JSON-Objekt zu konvertieren und dann Knoten aus dem konvertierten Objekt zu extrahieren. Ich benutze busyboy, um von der auf dem Server hochgeladenen Datei zu lesen. Und danach verwende ich inspect, um xml nach json zu konvertieren und dann das json-Objekt auszudrucken. Die endgültige Ausgabe scheint, alsExtrahieren Sie untergeordnete Objekte aus JSON-Objekt

{ declaration: { attributes: { version: '1.0', encoding: 'utf-8' } }, 
    root: 
    { name: 'order', 
    attributes: 
     { orderid: '123456', 
     xmlns: 'http://www.someRandomNameSpace.com' }, 
    children: 
     [ { name: 'orderperson', 
      attributes: {}, 
      children: [], 
      content: 'str1234' }, 
     { name: 'shipto', 
      attributes: {}, 
      children: 
      [ { name: 'name', 
       attributes: {}, 
       children: [], 
       content: 'Adnan Ali' }, 

Ich möchte die ‚name‘ = ‚Adnan Ali‘ von diesem Objekt lesen, wie wird sich das in NodeJS getan werden? Ich meine, wie kann ich das Objekt erreichen, das name = 'name' und content = 'Adnan Ali' hat.

Der Druckbefehl ist console.log(inspect(order, {colors: true, depth: Infinity}));

Antwort

1

Sie müssen die Arrays von Objekten durchsuchen für die Objekte, die Sie interessieren. Es gibt verschiedene Möglichkeiten, das zu tun, einschließlich Array.prototype.find (nicht sicher, ob es in allen Node.js-Versionen verfügbar ist) und lodash _.find.

Mit Array.prototype.filter eine Lösung könnte wie folgt aussehen (nicht getestet):

function findObject(array, key, value) { 
    var filtered = array.filter(obj => (obj[key] === value)); 
    if (filtered.length !== 1) throw new Error('Found ' + filtered.length + ' objects with `' + key + '`=`' + value + '`, expected to find 1.'); 
    return filtered[0]; 
} 

var shipto = findObject(input.root.children, 'name', 'shipto'); 
var name = findObject(shipto.children, 'name', 'name').content; 

console.log(name); 
+0

das ist, was ich in – theadnangondal

+0

interessiert verursacht einen Buildfehler. Weil es ein + Zeichen zwischen filtered.length und 'objects with ...' fehlt, hat es behoben und es hat funktioniert. Danke – theadnangondal

+0

Das war der "nicht getestete" Teil der Antwort. ;) Ich habe es korrigiert. –

1

sollte es möglich sein, das Objekt mit content: 'Adnan Ali' mit diesem Pfad data.root.children[1].children[0] zu erreichen:

const data = { 
 
    declaration: { 
 
    attributes: { 
 
     version: '1.0', 
 
     encoding: 'utf-8' 
 
    } 
 
    }, 
 
    root: { 
 
    name: 'order', 
 
    attributes: { 
 
     orderid: '123456', 
 
     xmlns: 'http://www.someRandomNameSpace.com' 
 
    }, 
 
    children: [{ 
 
     name: 'orderperson', 
 
     attributes: {}, 
 
     children: [], 
 
     content: 'str1234' 
 
    }, { 
 
     name: 'shipto', 
 
     attributes: {}, 
 
     children: [{ 
 
     name: 'name', 
 
     attributes: {}, 
 
     children: [], 
 
     content: 'Adnan Ali' 
 
     }] 
 
    }] 
 
    } 
 
}; 
 

 
console.log(data.root.children[1].children[0])

Erläuterung:

data ist ein Objekt, das ein Objekt root enthält. root ist ein Objekt, das ein Array children enthält. Das zweite Element in root.children (Index 1) ist ein Objekt, das ein weiteres Array children enthält, das das Objekt enthält, nach dem Sie beim ersten Index (0) suchen.

1

Da Sie NodeJS verwenden, wäre es vielleicht eine gute Idee, JSONPath auszuprobieren. Dann können Sie etwas tun:

var jp = require("JSONPath"); 
var tobj = { "declaration": { "attributes": { "version": '1.0', "encoding": 'utf-8' } }, 
    "root": 
    { "name": 'order', 
    "attributes": 
     { "orderid": '123456', 
     "xmlns": 'http://www.someRandomNameSpace.com' }, 
    "children": 
     [ { "name": 'orderperson', 
      "attributes": {}, 
      "children": [], 
      "content": 'str1234' }, 
     { "name": 'shipto', 
      "attributes": {}, 
      "children": 
      [ { "name": 'name', 
       "attributes": {}, 
       "children": [], 
       "content": 'Adnan Ali' 
       } 
      ] 
     } 
    ] 
}}; 
var result = jp.eval(tobj, "$..children[?(@.name === 'name' && @.content === 'Adnan Ali')]"); 
console.log(result); 

Beispiel Ausgabe:

[ { name: 'name', 
    attributes: {}, 
    children: [], 
    content: 'Adnan Ali' } ] 

(Vergessen Sie nicht, JSONPath ;-) zu installieren)

Quellen:
https://www.npmjs.com/package/JSONPath
http://goessner.net/articles/JsonPath/

Verwandte Themen