2017-03-20 13 views
0

xmlをjsonオブジェクトに変換し、変換されたオブジェクトからノードを抽出するのには苦労しています。私は、サーバー上にアップロードされたファイルから読み込むために忙しい人を使用しています。その後、私はXMLをjsonに変換してjsonオブジェクトを印刷するためにinspectを使用しています。最終的な出力はjsonオブジェクトから子オブジェクトを抽出する

{ 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' }, 

私はそれがnodejsで行われますどのようにこのオブジェクトから「名」=「アドナン・アリ」を読みたいと思えますか?私はname = 'name'とcontent = 'Adnan Ali'を持つオブジェクトにどのように到達できるのかを意味します。

印刷コマンドがある console.log(inspect(order, {colors: true, depth: Infinity}));

答えて

1

オブジェクトの配列を検索する必要がありますArray.prototype.find(すべてのNode.jsバージョンで利用できるかどうかは不明)とlodash _.findなど、さまざまな方法があります。 Array.prototype.filterソリューションを使用して

は、この(テストしていない)のようになります。

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

これは私が – theadnangondal

+0

に興味を持っていたものであるビルドエラーが発生します。 filtered.lengthと 'with objects with ...'の間に+記号がないため、問題は解決しました。ありがとう – theadnangondal

+0

それは答えの "テストされていない"部分でした。 ;)私はそれを修正しました。 –

1
あなたはこのパス data.root.children[1].children[0]content: 'Adnan Ali'を持つオブジェクトに到達することができるはず

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])

説明:

dataは、rootオブジェクトを含むオブジェクトです。 rootは、children配列を含むオブジェクトです。 root.children(インデックス1)の2番目の要素は、最初のインデックス(0)で探しているオブジェクトを含む別のchildren配列を含むオブジェクトです。

1

おそらくNodeJSを使用しているのでJSONPathを試してみるとよいでしょう。そして、あなたはこのような何かを行うことができます。

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); 

出力例:

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

ソース(;-) JSONPathをインストールすることを忘れないでください):
https://www.npmjs.com/package/JSONPath
http://goessner.net/articles/JsonPath/

関連する問題