Cheerio - 在兄弟姐妹下缩进新插入的元素?

时间:2018-05-16 23:07:11

标签: node.js xml cheerio xliff

我正在使用cheerio来改变节点中的xml文件。我在<target>之后插入节点/元素<source>,它与insertAfter()中的oldEl.translation.insertAfter(msgSourceEl); api一起使用。

然而,我松开了我的压力:

  <trans-unit id="title" datatype="html">
    <source>Login</source><target>iniciar sesión</target>

是否有可能或有办法缩进<target>iniciar sesión</target>元素下面新插入的<source>

2 个答案:

答案 0 :(得分:1)

只需修复最终的XML缩进:

可以使用xml-beautifier来实现人类可读的缩进XML

import beautify from 'xml-beautifier';
const HumanXML = beautify(XML);
console.log(HumanXML); // => will output correctly indented elements

(EXTRA)无需Cheerio

在下面的示例中,我们将使用xml2js将XML作为JSON进行操作,然后将其构建回原始XML格式

var xml2js = require('xml2js');
var xml = "<trans-unit id=\"title\" datatype=\"html\"><source>Login</source></trans-unit>"

xml2js.parseString(xml, function (err, result) {
    result["trans-unit"].target=["iniciar sessión"]
    var builder = new xml2js.Builder();
    var xml = builder.buildObject(result);
    console.log(xml)
});

最终输出:

<trans-unit id="title" datatype="html">
  <source>Login</source>
  <target>iniciar sessión</target>
</trans-unit>

我确信你这样做是循环的一部分,所以不应该推断这个例子来使它工作。我建议通常使用underscore(每个,地图,缩小,过滤......)

答案 1 :(得分:0)

首先,由于 source 是一个空元素,cheerio 不保留 <source>Login</source>。它将其转换为 <source>Login

因此为了演示元素缩进,我将使用 <source2> 元素。

如下所示,在给定的 html 中提供换行符和制表符可以解决这个问题。

let $ = require('cheerio').load(`
<trans-unit id="title" datatype="html">
    <source2>Login</source2>
</trans-unit>`)

$(`
    <target>iniciar sesión</target>`).insertAfter($('source2'));
console.log($.html('trans-unit'))

输出

<trans-unit id="title" datatype="html">
    <source2>Login</source2>
    <target>iniciar sesión</target>
</trans-unit>