3

我知道我的问题包括 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://... 

带有截断的网址

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

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

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

目标是拥有每个位置,每行一个。

4

3 回答 3

5

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

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

所以,我这样做了:

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

它有效!

谢谢大家

于 2013-02-06T17:18:35.743 回答
4

我曾经做过类似的事情:

clean_xml_message=$(echo "$xml_message" | sed 's/xmlns/ignore/')

最终,您可以尝试放回新行:

sed 's/></>\n</g' 

我猜你只想要没有<loc></loc>? 然后我会用 xmllint 选择所有 loc 元素:

<loc>...</loc><loc>...</loc><loc>...</loc>

然后添加新行:sed 's/<loc>/<loc>\n/g' | sed 's#</loc>#\n</loc>#g'

<loc>
...
</loc><loc>
...
</loc><loc>
...
</loc>

最后删除标签grep -v "<loc>" |grep -v "</loc>"或一个人grep -v "$<"可以做到这一点。(-v 是反转选择:http ://unixhelp.ed.ac.uk/CGI/man-cgi?grep )

于 2013-02-06T11:38:21.143 回答
0

对于换行问题,您可以查看此 repo:

https://gitlab.gnome.org/cykerway/libxml2

及其合并请求:

https://gitlab.gnome.org/GNOME/libxml2/merge_requests/8

基本上,它可以让您在 xpath 节点集结果中选择分隔符。所以有了这个example.xml

<?xml version="1.0" encoding="UTF-8"?>
<menu>
    <food>
        <name>Hot Chocolate</name>
        <price>$1.99</price>
    </food>
    <food>
        <name>Iced Tea</name>
        <price>$2.99</price>
    </food>
</menu>

你可以做:

# xmllint --xpath "//name/text()" --xpath-separator "\n" example.xml

输出:

Hot Chocolate
Iced Tea
于 2018-09-22T19:33:20.260 回答