xml 中的自闭标签 space 问题 - Cheerio

Self closing tag space issue in xml - Cheerio

我的问题是在 cheerio 解析期间没有在 XML 关闭标记中保留 space。

const xmlstr = <plugin> <testId /> <classId /> <goalsone> <goals /> <info>new</info> </goalsone> </plugin>;

const $one = cheerio.load(xmlstr, { xmlMode: true });

console.log( $one.xml() );

returns

<plugin> <testId/> <classId/> <goalsone> <goals/> <info>new</info> </goalsone> </plugin>

这里的输出来自 <testId/><classId/>,但初始状态是 <testId />,关闭标记末尾有一个 space,与 [= 的情况相同17=]。我想用标签保留自闭标签 space。我不想更改 XML 当前格式。

不幸的是,我认为您必须分叉 cheerio 并更新其 xml 代码。它似乎没有任何选项可以解决这个问题,post-将结果 XML 作为字符串处理会有问题。

看起来像 static.js uses serialize, which is the default export from dom-serializer. Looking at it, you'd just have to change what's currently line 144 来自:

tag += '/>';

tag += ' />';

您可以为此添加一个选项并向他们发送拉取请求。 :-)


您说过您的一些标签有 space 而有些没有。我认为在这种情况下,您最好的选择是进行合理化数据的提交(使其始终具有 space 或不具有 space),而不更改任何其他内容。这样,未来的提交就不会出现自关闭标签结尾不一致的问题。如果你这样做,最好坚持使用 cheerio 的默认序列化。

如果你真的想确保解析 XML 然后序列化它生成精确的词法 XML ,实现它的唯一真正方法是始终保持你的词法 XML 规范形式 - 官方 "Canonical XML" 标准(参见 https://www.xml.com/pub/a/ws/2002/09/18/c14n.html),或您自己设计的其他规范表示。不幸的是,您可能会发现 tools/libraries 在 Javascript 世界中这样做并不多,因此您可能必须自己设计。

一种更特别的方法是通过确保在序列化时避免 "quirkiness" 来尝试避免最常见的陷阱。例如,避免在属性周围使用单引号,避免 CDATA 部分——并避免在标记中使用不必要的空格。