2017-04-26 15 views
0

我试图从命令行上的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

+0

好吧,也许我已经明白了为什么终端责备我。出现错误的标签是这样形成的: 'word:anotherword' 而且似乎这个表示法意味着我们应该在该标记中找到xmlns属性。但我不知道如何删除这些符号。我想我必须使用REGEX,但我仍然不适合做这样的操作。 –

+0

如果您的文档定义了名称空间,则可以在XPath表达式中使用它的前缀,另请参阅http://xmlstar.sourceforge.net/doc/UG/ch05.html。 – npostavs

+0

谢谢!我用'xmlstarlet sel -t -m“// _:content”-c。 good-output.xml“,它给了我相应的标签。现在唯一的问题是我只想要标签的内容,而不是标签本身+内容。我应该怎么做? –

回答

1

所以这是检索与多个命名空间一个XML文件的内容的最终解决方案:

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


npostavs谢谢你指导我。

我相信我的第一次尝试给我的标签除了所需的内容是一个问题,但实际上在我的案件没有。如果是别人的话,这是如何进行的:

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

OR

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

简化:

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

+0

您可以简化为'xmlstarlet sel -t -v“/ _:entry/_:content”output.xml“ – npostavs

+0

经过测试,它也可以工作,谢谢:)我更新了答案。 –

0

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

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