2016-08-12 1 views
0

Ich habe eine XML-Datei, wo ich Attributwerte mit den Werten aus einem Array mit GulpJS ersetzen muss.So ersetzen Sie Zeichenfolgen mit Werten in einem Array mit Gulp ersetzen

JavaScript-Code:

var gulp = require('gulp'); 
var replace = require('gulp-replace'); 
gulp.task('default', function() { 
    //array is dynamic 
    var users = ["existing_value1", "existing_value2", "existing_value3"]; 
    var num = users.length(); 
    for (i=0;i<num;i++) { 
     gulp.src(['idmap/*.xml']) 
      .pipe(replace(users[i], 'SYSTEM')) 
      .pipe(gulp.dest('build/')); 
    } 
}); 

XML-Beispiel:

<?xml version="1.0"?><IDMAP><RECORD> 
<TOKEN data = "414"/><NAME data="existing_value1"/></RECORD> 
<RECORD><TOKEN data = "420"/><NAME data="existing_value2"/></RECORD> 
<RECORD><TOKEN data = "361"/><NAME data="existing_value3"/></RECORD> 
</IDMAP> 

Mit diesem Code, ich bin in der Lage den String in XML mit dem letzten Element in Array zu ersetzen. Wie man alle Einzelteile durch die in der Reihe ersetzt und dann den Aufbau tut?

Vielen Dank im Voraus!

Antwort

1

Jedes Mal, wenn Sie die für Schleife durchlaufen, überschreiben Sie die Datei dest. Deshalb haben Sie nur das letzte Element in Ihrem Array ersetzt.

schluck-ersetzen nur String oder RegExp als Suche Parameter unterstützen. Daher würde ich vorschlagen, dass Sie Ihr eigenes Plugin schreiben. Es würde so etwas sein:

var gulp = require('gulp'); 
var rs = require('replacestream'); 
var through = require('through2'); 

gulp.task('default', function() { 
    var users = ["existing_value1", "existing_value2", "existing_value3"]; 
    gulp.src(['idmap/*.xml']) 
    .pipe(replaceArray(users, 'SYSTEM')) 
    .pipe(gulp.dest('build/')) 
}); 

/** 
* This is your plugin inspired in gulp-replace 
* 
* @method replaceArray 
* @param {Array} searchArray 
* @param {String} replacement 
*/ 
function replaceArray(searchArray, replacement) { 
    return through.obj(function(file, encoding, callback) { 
    if (file.isStream()) { 
     file.contents = searchArray.reduce(function (contents, search) { 
     return contents.pipe(rs(search, replacement)); 
     }, file.contents); 
     return callback(null, file); 
    } 
    if (file.isBuffer()) { 
     var result = searchArray.reduce(function (contents, array) { 
     return contents 
      .split(search) 
      .join(replacement); 
     }, String(file.contents)); 
     file.contents = new Buffer(result); 
     return callback(null, file); 
    } 
    callback(null, file); 
    }); 
} 
+0

@king, bin ich nicht sicher, wie 'Array.prototype.replace' sich mit' Streams' verhält. Probieren Sie es aus und lassen Sie es mich wissen. –

+0

danke noch einmal! Nachfolgend arbeitete, 'code' Funktion replaceArray (searchArray, Ersatz) { return through.obj (function (Datei, Kodierung, Rückruf) { if (file.isBuffer()) { var result = searchArray. reduce (Funktion (Inhalt, SuchArray)) { Rückgabe contents.split (searchArray) .join (Ersetzung); }, Zeichenfolge (file.contents)); file.contents = neuer Puffer (Ergebnis); Rückruf (null , Datei); } Rückruf (Null, Datei); }); } 'code' –

+0

@king, wenn es für Sie funktioniert, Würden Sie die Antwort upvote und akzeptieren? :) –

1

Sie können dies mit Regex tun. Wenn es Ihnen möglich ist, wäre es besser, wenn Sie ein Muster schreiben könnten, das allen gewünschten Attributen entspricht. Zum Beispiel würde dies auf Ihrem Beispiel arbeitet:

gulp.task('default', function() { 
    gulp.src(['idmap/*.xml']) 
     .pipe(replace(/existing_value\d+/g, 'SYSTEM')) 
     .pipe(gulp.dest('build/')); 
}); 

Aber wenn Ihre Attribute komplizierter sind, als dass man einen dynamischen Ausdruck von Ihrem users Array erzeugen kann:

gulp.task('default', function() { 

    var users = ['existing_value1', 'existing_value2', 'existing_value3']; 
    var regex = new RegExp('\\b' + users.join('\\b|\\b') + '\\b', 'g'); 

    gulp.src(['idmap/*.xml']) 
     .pipe(replace(regex, 'SYSTEM')) 
     .pipe(gulp.dest('build/')); 

}); 
+0

Vielen Dank @MadScone für Ihre Hilfe! Ich konnte nicht mit Regex gehen, da die Attribute etwas kompliziert sind, wie Sie richtig erwähnten. –

Verwandte Themen