无法使用命令行(名称空间限制)中的XMLStarlet从XML文件中提取数据



我尝试从命令行上提取XML文件(我名为output.xml(的数据(然后,如果我设法执行此操作,请将其放入脚本中(。

我已经看到,更好的工具是xmlstarlet。但是xmlstarlet sel -t -m "/entry/content" output.xml不起作用。

注意:我尝试使用xmlstarlet el output.xml检查文件的XPATH结构,并且它起作用。这意味着工具看到元素。


我看到有两个条件可以使XMlstarlet起作用:

1- XML文件应良好。stackoverflow相关链接

所以我应用了此命令来创建一个形式良好的文件:

xmlstarlet fo -R output.xml >> good-output.xml

2- XML对默认名称空间非常挑剔。如果文档拥有它,请在选择元素或删除文档中" XMLN"的所有事件之前声明它。stackoverflow相关链接

所以我做到了:

$ cat good-output.xml | sed -e 's/ xmlns.*=".*"//g' >> very-good-output.xml

但是,即使执行了这两个步骤,我也有另一个错误,并且不知道如何修复它...终端点我删除了名称空间的位置,并说" collection in Collection namespace Prefix app in Collection in Collection"。我该做什么?使用名称空间不起作用,现在它敦促将它们再次放在我身上...

有帮助吗?

原始问题的屏幕截图

最终问题的屏幕截图

,因此这是用多个名称空间检索XML文件内容的最终解决方案:

xmlstarlet sel -t -m "//_:content" -c . good-output.xml


npostavs感谢您指导我。

我相信我的第一次尝试给了我标签,除了所需的内容是一个问题,但实际上在我的情况下。如果其他人是这种情况,这就是如何进行:

xmlstarlet sel -t -m "/_:entry/_:content/text()" -c . output.xml

xmlstarlet sel -t -m "/_:entry/_:content" -v . output.xml

简化:

xmlstarlet sel -t -v "/_:entry/_:content" output.xml

似乎如果XML使用其他名称空间,则会发生此类问题。在这些情况下,一种克服名称空间问题的解决方案是告诉xmlstarlet元素的预期名称空间值:

xmlstarlet sel -N x='http://different.namespace.url/XMLSchema' -t -m '//x:YourElemHere' input.xml

最新更新