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

时间:2017-04-26 15:57:35

标签: command-line xmlstarlet

我尝试在命令行中从xml文件(我将其命名为output.xml)中提取数据(然后,如果我设法这样做,则将其放入脚本中)。

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

注意:我试图xmlstarlet el output.xml检查文件的Xpath结构并且它有效。这意味着该工具可以看到元素。

我看到有两个条件可以使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

然而,即使执行这两个步骤,我还有另一个错误,并且不知道如何解决它...终端指向我删除命名空间的位置并说'#34;命名空间前缀app关于集合没有定义"。我该做什么?使用命名空间它不起作用,现在它敦促再次将它们放在我身上......

任何帮助?

Screenshot of the original problem

Screenshot of the final problem

2 个答案:

答案 0 :(得分:2)

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

GTIN = 0 while True: try: GTIN = int(input("input your gtin-8 number:")) if len(str(GTIN)) == 8: break else: print("make sure the length of the barcode is 8") elif: GTIN=(""):

npostavs感谢您指导我。

我相信我的第一次尝试给了我标签以外的所需内容是一个问题,但实际上在我的情况下没有。如果是其他人的情况,这是如何继续:

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

OR

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

简化为:

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

答案 1 :(得分:0)

如果xml使用不同的命名空间,似乎会发生这样的问题。在这些情况下,克服名称空间问题的一个解决方案是告诉xmlstarlet元素的预期名称空间值:

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