2017-01-12 4 views
1

nodejsスクリプトでxml-streamを使用して非常に大きなXMLファイルを解析しようとしています。XMLを解析してxml-streamで子を収集する問題

XMLストリームがここで見つけることができます - https://github.com/assistunion/xml-stream

<?xml version="1.0"?> 
<Products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" version="0.96" versionTimestamp="2012-02-07T03:00:00Z" fooKey="6402420af51e08"> 
    <Product> 
     <id>296834</id> 
     <name>Thing</name> 
     <Photos> 
      <Photo> 
       <MediaURL>http://url.com/to/image/file</MediaURL> 
      </Photo> 
      <Photo> 
       <MediaURL>http://url.com/to/image/secondfile</MediaURL> 
      </Photo> 
      <Photo> 
       <MediaURL>http://url.com/to/image/thirdfile</MediaURL> 
      </Photo> 
     </Photos> 
    </Product> 
</Products> 

そして、私のnodejsコードは次のようになります...

var fs  = require('fs') 
, path  = require('path') 
, XmlStream = require('xml-stream') 
; 

// Create a file stream and pass it to XmlStream 
var stream = fs.createReadStream(path.join(__dirname, 'samplekirby.xml')); 
var xml = new XmlStream(stream); 

xml.preserve('Product', true); 
xml.collect('Photos'); 
xml.on('endElement: Product', function(item) { 
    console.log(item); 
}); 

出力...

どう
{ '$children': 
[ { '$children': [Object], '$text': '296834', '$name': 'id' }, 
{ '$children': [Object], '$text': 'Thing', '$name': 'name' }, 
{ '$children': [Object], Photo: [Object], '$name': 'Photos' } ], 
id: { '$children': [ '296834' ], '$text': '296834', '$name': 'id' }, 
name: { '$children': [ 'Thing' ], '$text': 'Thing', '$name': 'name' }, 
Photos: 
{ '$children': [ [Object], [Object], [Object] ], 
Photo: { '$children': [Object], MediaURL: [Object], '$name': 'Photo' }, 
'$name': 'Photos' }, 
'$name': 'Product' } 

画像のURLは取得できますか?

さまざまな順序でさまざまなノードで.collect()と.preserve()を試しました。このlibの複雑な使用例はあまりないようです。私は非常に大きなXMLファイルを持っており、xml2jsはそれを処理できませんでした。何らかの方法で深さを増やす方法を見つけ出すことができたら、私はこのライブラリの選択肢に満足しています。

答えて

1

あなただけのURL

を取得したい場合は
var fs = require('fs'), 
    path = require('path'), 
    XmlStream = require('xml-stream'); 

// Create a file stream and pass it to XmlStream 
var stream = fs.createReadStream(path.join(__dirname, 'sample.xml')); 
var xml = new XmlStream(stream); 

xml.collect('Photo'); 
xml.on('endElement: Product', function(product) { 
    console.log(JSON.stringify(product, null, 2)); 
}) 

出力:

{ 
    "id": "296834", 
    "name": "Thing", 
    "Photos": { 
    "Photo": [ 
     { 
     "MediaURL": "http://url.com/to/image/file" 
     }, 
     { 
     "MediaURL": "http://url.com/to/image/secondfile" 
     }, 
     { 
     "MediaURL": "http://url.com/to/image/thirdfile" 
     } 
    ] 
    } 
} 
+0

@Kirby更新。 –

+0

これははるかに近いです!しかし、MediaUrlは1つしかありません。 – Kirby

+0

@Kirby my bad。更新しました。 –