我试图从命令行上的xml文件(我命名为output.xml)中提取数据(然后,如果我设法执行此操作,把它放在脚本中)。无法在命令行中使用XMLStarlet从XML文件中提取数据(命名空间限制)
我见过更好的工具是XMLStarlet。但是xmlstarlet sel -t -m "/entry/content" output.xml
不起作用。
注:我尝试了xmlstarlet el output.xml
来检查文件的Xpath结构,它的工作原理。这意味着该工具可以查看元素。
我看到有2个条件,使XMLStarlet工作:
1- XML文件必须进行有效形成。 Stackoverflow related link
所以我申请这个命令来创建一个结构良好的文件:
xmlstarlet fo -R output.xml >> good-output.xml
2- XML是对默认命名空间非常挑剔。如果文档具有它,请在选择元素或删除文档中所有“xmlns”的出现之前声明它。 Stackoverflow related link
所以我做:
$ cat good-output.xml | sed -e 's/ xmlns.*=".*"//g' >> very-good-output.xml
然而,即使在执行这两个步骤,我还有一个错误,不知道如何解决它...终端分给我的地方我删除了名称空间,并说“集合中的名称空间前缀应用程序未定义”。我该做什么?命名空间它不起作用,现在它敦促再次把它们放在我身上...
任何帮助吗?
Screenshot of the original problem
Screenshot of the final problem
好吧,也许我已经明白了为什么终端责备我。出现错误的标签是这样形成的: 'word:anotherword' 而且似乎这个表示法意味着我们应该在该标记中找到xmlns属性。但我不知道如何删除这些符号。我想我必须使用REGEX,但我仍然不适合做这样的操作。 –
如果您的文档定义了名称空间,则可以在XPath表达式中使用它的前缀,另请参阅http://xmlstar.sourceforge.net/doc/UG/ch05.html。 – npostavs
谢谢!我用'xmlstarlet sel -t -m“// _:content”-c。 good-output.xml“,它给了我相应的标签。现在唯一的问题是我只想要标签的内容,而不是标签本身+内容。我应该怎么做? –