代码之家  ›  专栏  ›  技术社区  ›  dman

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

  •  1
  • dman  · 技术社区  · 7 年前

    我在一个节点中使用xml进行变异。我正在插入节点/元素 <target> 之后 <source> 这与 insertAfter() 空气污染指数 oldEl.translation.insertAfter(msgSourceEl); .

    然而,我松开了我的契约:

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

    有没有可能,或者有没有办法,将新插入的文件缩进 <target>iniciar sesión</target> 在下面 <来源> 要素

    2 回复  |  直到 7 年前
        1
  •  1
  •   Community CDub    5 年前

    只需修复最终的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 对于通常的(每个,映射,减少,过滤…)

        2
  •  0
  •   Marinos An    4 年前

    首先,自从 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>