我尝试在命令行中从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关于集合没有定义"。我该做什么?使用命名空间它不起作用,现在它敦促再次将它们放在我身上......
任何帮助?
答案 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