如何使用xmllint去除Gnote生成XML中<note-content>文本输出的多余空行?
如何使用xmllint去除Gnote生成XML中文本输出的多余空行?
我来帮你分析问题并给出解决方案:
问题根源
你遇到的多余空行,其实是Gnote生成的XML结构和文本节点自带的空白换行共同导致的:
Gnote在生成XML时,会在<note-content>、<list>等元素前后插入包含换行、空格的空白文本节点;同时每个<list-item>里的文本也自带换行符。你的原始XPath只是过滤了完全空白的节点,但没有处理节点内部的多余换行,所以输出时这些换行就变成了多余的空行。
正确的xmllint命令
直接用下面的命令,就能得到你想要的无多余空行的输出:
xmllint --xpath "//*[local-name()='note-content']//text()[normalize-space()]/normalize-space(.)" a.xml
命令解释
//*[local-name()='note-content']//text()[normalize-space()]:选中<note-content>下所有非空白的文本节点(过滤掉完全是换行、空格的空节点);/normalize-space(.):对每个选中的文本节点,去除内容前后的所有空白(包括换行、空格),同时把内容中间的多个空白合并成一个(你的内容里没有这种情况,不影响结果);- xmllint会自动把每个处理后的文本内容按顺序输出,每个内容占一行,正好符合你要的格式。
为什么之前的命令不行?
- 你尝试的
normalize-space(//text()) | ...报错,是因为XPath中normalize-space()返回的是字符串,而|操作符只能用于节点集,类型不匹配所以报错; - 只加
[normalize-space()]过滤节点,只是去掉了完全空白的节点,但没处理节点内部的多余换行,所以输出还是会有空行; - 去掉XML里的换行后命令有效,是因为XML里的空白文本节点被去掉了,剩下的文本节点没有多余换行,自然输出正常。
备注:内容来源于stack exchange,提问作者Yetoo
相关产品推荐
相关产品推荐

