2015-07-12 87 views
-1

現在,我的代碼從包含多個文檔的XML文件創建一個流,並將其合併到一個XML文檔中。然後它將該字符串傳遞給XML解析器,該解析器允許我從XML流中檢索數據。我想通過分離創建xml流的邏輯和xml解析器的邏輯來模塊化我的應用程序。下面是我的代碼:將解析邏輯拆分爲單獨的文件Node.js

var fs = require('fs'); 
var path = require('path'); 
var split = require("split"); 
var util = require("util"); 
var Transform = require("stream").Transform; 
var XmlStream = require('xml-stream'); 
var parseXml; 


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


util.inherits(CombineXmlDocs, Transform); 
function CombineXmlDocs() { 
    Transform.call(this, { "objectMode": true }); 
    this.currLine = 0; 
} 

CombineXmlDocs.prototype._transform = function (line, encoding, processed) { 
    this.currLine++; 
    if (this.currLine === 3) { 
     this.push('<week-of-patents>\n'); 
    } 
    if (this.currLine < 3 || (line.indexOf('<?xml') === -1 && line.indexOf('<!DOCTYPE') === -1)) { // handle first line 
     this.push(line + '\n'); 
    } 
    processed(); // we're done processing the current line 
}; 

CombineXmlDocs.prototype._flush = function(cb) { 
    cb(); 
}; 

// streamXmlFile.pipe(split()).pipe(new CombineXmlDocs()).pipe(process.stdout); 
parseXml = new XmlStream(streamXmlFile.pipe(split()).pipe(new CombineXmlDocs())); 
// parseXml = new XmlStream(streamXmlFile); 

parseXml.on('endElement: date', function(date) { 
    console.log(date.$text); 
}); 

回答

0

我通過創建一個流來連接xml文檔並導出流。然後在我的app.js中需要該文件,並使用導出的流傳遞給我的XML解析器。

app.js代碼:

var createParsableXml = require('./createParsableXml.js'); 
var XmlParserStream = require('xml-stream'); 
var parseXml; 

// create a parsable xml stream using xml-stream node.js module 
parseXml = new XmlParserStream(createParsableXml.streamConcatXml); 

parseXml.on('endElement: date', function(date) { 
    console.log(date.$text); 
}); 

createParsableXml.js代碼:

var fs = require('fs'); 
var path = require('path'); 

// allows for stream parsing on a line by line basis 
var split = require('split'); 

var util = require('util'); 
var Transform = require('stream').Transform; 
var streamXmlFile = fs.createReadStream(path.join(__dirname, 'ipg140107.xml')); 


util.inherits(CombineXmlDocs, Transform); 
function CombineXmlDocs() { 
    Transform.call(this, { "objectMode": true }); 
    this.currLine = 0; 
} 

// logic for parsing concatenated uspto xml docs into one xml doc 
CombineXmlDocs.prototype._transform = function (line, encoding, processed) { 
    // removes xml and doctype declarations except for the first instance, adds root element to doc 
    this.currLine++; 
    if (this.currLine === 3) { 
     this.push('<week-of-patents>\n'); 
    } 
    if (this.currLine < 3 || (line.indexOf('<?xml') === -1 && line.indexOf('<!DOCTYPE') === -1)) { // handle first line 
     this.push(line + '\n'); 
    } 
    processed(); // we're done processing the current line 
}; 

CombineXmlDocs.prototype._flush = function(cb) { 
    cb(); 
}; 

exports.streamConcatXml = streamXmlFile.pipe(split()).pipe(new CombineXmlDocs());