gpt4 book ai didi

xml - 如何使用 xmllint --xpath 在每次匹配后附加换行符

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:01 31 4
gpt4 key购买 nike

我有以下 HTML 代码:

<textarea name="command" class="setting-input   fixed-width" rows="9">1</textarea><textarea name="command" class="setting-input   fixed-width" rows="5">2</textarea>

我想解析它以接收这样的输出:

1
2

目前我正在使用:

xmllint --xpath '//textarea[@name="command"]/text()' --html

但它不会在每次匹配后附加换行符。

最佳答案

2020 年你好!

自 libxml v2.9.9 起,此行为 has been fixed in xmllint itself .

但是,如果您使用的是比这更早的版本,并且不想从源代码构建 libxml 只是为了获得固定的 xmllint ,您将需要此处的其他解决方法之一。在撰写本文时,例如,最新的 CentOS 8 仍在使用 libxml (2.9.7) 版本,其行为与 OP 描述的方式相同。

正如我从 this SO answer 收集到的, 理论上可以将命令输入 --shell xmllint 的旧版 (<2.9.9) 选项,这将在单独的行上生成每个节点。但是,您最终不得不使用 sed 对其进行后处理。或 grep删除 shell 模式(面向人的)输出的视觉碎屑。这并不理想。


XMLStarlet ,如果可用,提供另一种解决方案,但您确实需要使用 xmlstarlet fo在使用 xmlstarlet sel 之前将您的 HTML 片段格式化为有效的 XML提取节点:

echo '
<textarea name="command" class="setting-input fixed-width"
rows="9">1</textarea>
<textarea name="command" class="setting-input fixed-width"
rows="5">2</textarea>' \
| xmlstarlet fo -H -R \
| xmlstarlet sel -T -t -v '//textarea[@name="command"]' -n

如果Attempt to load network entity来自第二个的消息 xmlstarlet调用惹恼了你,只需添加 2>/dev/null在最后抑制它(冒着抑制打印到标准错误的其他消息的风险)。

XMLStarlet 选项解释(另见 user's guide):

  • fo -H -R格式化输出,期望 HTML 输入,并尽可能多地恢复错误输入
    • 这将添加一个 <html>根节点,使 OP 示例中的片段有效 XML
  • sel -T -t -v //xpath -n选择基于 XPath 的节点 //xpath
    • 输出纯文本(-T)而不是 XML
    • 使用给定的模板 (-t) 返回节点的值 (-v) 而不是节点本身(允许您放弃在 XPath 表达式中使用 text())
    • 最后,添加一个换行符 ( -n )

编辑:删除了半实现的 xmllint --shell解决方案,因为它很糟糕。添加了一个实际处理 OP 数据的 XMLStarlet 示例。

关于xml - 如何使用 xmllint --xpath 在每次匹配后附加换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18532948/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com