首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用xmlint -xpath在每次匹配后追加换行符

如何使用xmlint -xpath在每次匹配后追加换行符
EN

Stack Overflow用户
提问于 2013-08-30 12:28:50
回答 5查看 10.5K关注 0票数 16

我有以下HTML代码:

代码语言:javascript
复制
<textarea name="command" class="setting-input   fixed-width" rows="9">1</textarea><textarea name="command" class="setting-input   fixed-width" rows="5">2</textarea>

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

代码语言:javascript
复制
1
2

目前我正在使用:

代码语言:javascript
复制
xmllint --xpath '//textarea[@name="command"]/text()' --html

但是它不会在每一场比赛之后追加换行符。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-01-17 23:15:26

你好,来自2020年!

在libxml的2.9.9版本中,这个行为是本身

但是,如果您使用的是更老的方法,并且不希望仅仅为了获得固定的xmllint而从源代码构建libxml,那么这里需要其他解决方案之一。例如,在撰写本文时,最新的CentOS 8仍然在使用libxml (2.9.7)的版本,该版本的行为方式与OP描述的一样。

正如我从这就是答案中收集到的,理论上可以将一个命令传递到旧版本(<2.9.9)版本的xmllint--shell选项中,这将在单独的行上生成每个节点。但是,您最终不得不使用sedgrep对其进行后期处理,以删除shell模式(面向人的)输出的视觉碎片。不太理想。

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

代码语言:javascript
复制
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选项(另请参阅用户指南):

  • fo -H -R -rmat输出,期望输入,并恢复尽可能多的错误输入
    • 这将添加一个<html>根节点,使OP示例中的片段有效

  • 基于sel -T -t -v //xpath -n -sel的XPath //xpath 节点
    • 输出纯文本(-T)而不是XML
    • 使用给定的模板(-t)返回节点的值(-v),而不是节点本身(允许在XPath表达式中放弃使用text() )
    • 最后,添加一个换行符(-n)

编辑:删除半实现的xmllint --shell解决方案,因为它是坏的。添加了一个实际适用于OP数据的XMLStarlet示例。

票数 11
EN

Stack Overflow用户

发布于 2018-07-30 14:41:12

试试这个补丁,它提供了两个选项:

  • --xpath:与旧--xpath相同,节点由\n分隔。
  • --xpath0:与旧--xpath相同,节点由\0分隔。

测试输入(a.html):

代码语言:javascript
复制
<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:

代码语言:javascript
复制
# xmllint --xpath '//textarea[@name="command"]/text()' --html a.html

测试输出1:

代码语言:javascript
复制
 1
 2

测试命令2:

代码语言:javascript
复制
# xmllint --xpath0 '//textarea[@name="command"]/text()' --html a.html | xargs -0 -n1

测试输出2:

代码语言:javascript
复制
 1
 2
票数 5
EN

Stack Overflow用户

发布于 2013-08-30 13:05:46

我做了以下,丑陋的把戏,请随时提供一个更好的解决方案。

使用以下命令将</textarea>替换为\n</textarea>,从而更改了HTML代码:

代码语言:javascript
复制
sed 's/\<\/textarea/\'$'\n\<\\/textarea/g' f
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18532948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档