Cheerio - 缩进同级下新插入的元素



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

但是,我失去了我的缩进:

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

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

只需修复最终的 XML 缩进:

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

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

(额外) 无需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通常(每个,映射,减少,过滤...

首先,由于 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>

最新更新