使用xmllint从XML节点获取URL,添加新行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用xmllint从XML节点获取URL,添加新行相关的知识,希望对你有一定的参考价值。

我使用以下命令从XML文件中提取URL:

xmllint --xpath '//ROOT/ITEM/PHOTO/text()' xml_2015-05-13-20:39.xml

它有效,但输出是URL的大量文本:

http://1.jpghttp://2.jpghttp://3.jpghttp://4.jpghttp://5.jpghttp://6.jpg

每次比赛结束后可以添加 换行符吗?

XML:

<ROOT>
   <ITEM>
      <PHOTO>http://1.jpg</PHOTO>
   </ITEM>
   <ITEM>
      <PHOTO>http://2.jpg</PHOTO>
   </ITEM>
</ROOT>
答案

这是一个可能的方法来做白色xidel:

xidel -e "//ROOT/ITEM/PHOTO/text()" -q ./my.xml > ./processed_xml
另一答案

获取XMLStarlet并尝试

 xmlstarlet sel -t -m "/ROOT/ITEM/PHOTO" -v . -n xml_2015-05-13-20:39.xml 
            |   |  |                     |    |
            |   |  |                     |    -n ... add new-line after printed element
            |   |  |                     -v .  print the value of the matched node
            |   |  -m match this Xpath
            |   -t  (select) using a template (the -m part)
            sel(ect) 

xmlstarlet专为命令行处理和脚本解决方案而设计,而xmllint不会将此类用途列为最高优先级。

另一答案

正如其他人已经说过的那样,xmllint本身是不可能的。

但是在sed这样的工具的帮助下,你可以实现你想要的:

$ xmllint --xpath "//ROOT/ITEM/PHOTO" xml_2015-05-13-20:39.xml | sed "s/</PHOTO>/</PHOTO>
/g"
<PHOTO>http://1.jpg</PHOTO>
<PHOTO>http://2.jpg</PHOTO>

现在要删除标签,需要一个额外的表达式:

$ xmllint --xpath "//ROOT/ITEM/PHOTO" xml_2015-05-13-20:39.xml | sed "s/</PHOTO>/</PHOTO>
/g ; s/<[^>]+>//g"
http://1.jpg
http://2.jpg

以上是关于使用xmllint从XML节点获取URL,添加新行的主要内容,如果未能解决你的问题,请参考以下文章

使用 xmlstarlet 或 xmllint 获取属性值

xmllint:如何使用本地 DTD 文件验证 XML

如何将环境变量传递给传递给xmllint的命令?

如何在 Sublime Text 3 中使用 xmllint?

在列表视图中添加倒数计时器会在每个新行中重新启动

如何使用xmllint / xpath解析不同元素上的几个属性的值?