我知道我的问题包括两个问题...
首先,我想使用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
第二行给我“-”每2行...最后一行是"/>“..。
我开始变得非常紧张。:)
如果您能找到任何解决方案,非常感谢。
我们的目标是拥有每个位置,每行一个。
发布于 2013-02-06 19:38:21
我以前也做过类似的事情:
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-07 01:18:36
@BrnVrn是对的,我只需要在标签后面附加"\n“
然后我找到了关于名称空间的答案,我可以使用local-name来不检查默认名称空间
所以,我这样做了:
xmllint --xpath "//*[local-name()='loc']/text()" <(sed 's/<loc>/<loc>\n/g' sitemaps.xml)而且它起作用了!
感谢所有人
发布于 2018-09-23 03:33:20
对于换行符问题,您可以查看以下代码库:
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 Teahttps://stackoverflow.com/questions/14726951
复制相似问题