输出行的 xmllint 问题

标签 xml bash xml-parsing sitemap xmllint

我知道我的问题包括2个问题...

起初,我想用xmllint输出“loc”内容标签。我加载的站点地图有一个 xmlns="..."。

在 xmllint shell 上,我需要这样做:

setrootns
xpath //defaultns:loc

那行得通……没问题。但我需要在 bash 脚本中执行此操作。

(AFAIK)xmllint 没有告诉“我们走吧,setrootns”的选项,所以我不能这样做:

xmllint --xpath "//loc" sitemaps.xml
# or
xmllint --xpath "//defaultns:loc" sitemaps.xml

这是第一个问题,我如何告诉 xmllint 加载默认的 ns ?

如果我不能,让我们看看我的第二个解决方案:

我可以删除 xmlns 属性,然后就没有 ns 可以使用了:

xmllint --xpath "//loc" <(sed -r 's/xmlns=".*?"//' sitemaps.xml)

但是......现在......我的 500 个“loc”内容的整个响应被连接在一行中!......

我也试过这个:

xmllint --shell sitemaps.xml <<EOF
setrootns
xpath //defaultns:loc/text()
EOF

或者再次

xmllint --shell sitemaps.xml <<EOF
setrootns
cat //defaultns:loc
EOF

第一个给我(例如)

465  TEXT
    content=http://... 

带有截断的 url

第二个每两行给我一个“------”……最后一行给我一个“/>”……

然后我开始非常紧张...:)

如果您找到任何解决方案,非常感谢。

目标是每行一个位置。

最佳答案

@BrnVrn 是对的,我只需要在标签后附加“\n”

然后我找到了关于命名空间的答案,我可以使用 local-name 来不检查默认命名空间

所以,我这样做了:

xmllint  --xpath "//*[local-name()='loc']/text()" <(sed 's/<loc>/<loc>\n/g' sitemaps.xml)

而且有效!

感谢大家

关于输出行的 xmllint 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726951/

相关文章:

c++ - 使用 Qdom 忽略无效的 XML 标签?

java - XML解析后无法获得所需的输出

java - 从动画 xml 文件访问值 xml 文件

使用 perl 进行格式化的 Python 子进程给出不完整的输出

linux - 在 Bash 脚本中查找基于文件名的自动完成

bash - 使用 awk 替换范围内的值

python - 使用 python 创建循环来查找 pom.xml 文件中的依赖项

android - 基线对齐的 TextInputLayout 和 Spinner

c++ - g++ 编译对外部 hpp 文件的 undefined reference

java - 简单的 XML 和 HashSet