0

GulpJS を使用して、属性値を配列の値に置き換える必要がある XML ファイルがあります。

JavaScript コード:

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:

<?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>

このコードを使用すると、XML の文字列を配列の最後の項目に置き換えることができます。すべてのアイテムを配列内のものに置き換えてからビルドする方法は?

前もって感謝します!

4

2 に答える 2

2

forループが実行されるたびに、 destファイルが上書きされます。そのため、配列の最後の項目のみを置き換えました。

gulp-replaceのみをサポートするStringRegExp検索パラメーターとして使用します。したがって、独自のプラグインを作成することをお勧めします。次のようになります。

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);
  });
}
于 2016-08-12T10:11:51.200 に答える
1

正規表現を使用してこれを行うことができます。可能であれば、必要なすべての属性に一致するパターンを記述できるとよいでしょう。たとえば、これはあなたの例で機能します:

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

ただし、属性がそれよりも複雑な場合は、users配列から動的式を生成できます。

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

});
于 2016-08-12T10:12:37.570 に答える