我正在使用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>