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

Cannot extract data from XML file using XMLStarlet in the command line (namespace restriction)

我尝试在命令行上从 xml 文件(我将其命名为 output.xml)中提取数据(然后,如果我成功了,将其放入脚本中)。

我发现更好的工具是 XMLStarlet。但是 xmlstarlet sel -t -m "/entry/content" output.xml 不起作用。

注意:我尝试 xmlstarlet el output.xml 检查文件的 Xpath 结构,它 works.That 意味着该工具可以看到元素。


我看到 XMLStarlet 工作有 2 个条件:

1- XML 文件应该格式正确。

所以我应用了这个命令来创建一个格式正确的文件:

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

2- XML 对默认命名空间非常挑剔。如果文档有它,请在选择元素之前声明它或删除文档中所有出现的 "xmlns" 。 Whosebug related link

所以我做到了:

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

但是,即使执行了这两个步骤,我仍然遇到另一个错误,并且不知道如何修复它...终端指向我删除名称空间的位置并显示 "Namespace prefix app on collection is not defined"。我该做什么?使用名称空间它不起作用,现在它敦促再次将它们放在我身上...

有什么帮助吗?

Screenshot of the original problem

Screenshot of the final problem

所以这是检索具有多个命名空间的 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