首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmllint输出行的问题

xmllint输出行的问题
EN

Stack Overflow用户
提问于 2013-02-06 18:38:40
回答 3查看 5.6K关注 0票数 3

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

首先,我想使用xmllint输出"loc“内容标记。我加载的网站地图有一个xmlns="...“。

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

代码语言:javascript
复制
setrootns
xpath //defaultns:loc

这是可行的..。没问题。但我需要在bash脚本中执行此操作。

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

代码语言:javascript
复制
xmllint --xpath "//loc" sitemaps.xml
# or
xmllint --xpath "//defaultns:loc" sitemaps.xml

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

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

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

代码语言:javascript
复制
xmllint --xpath "//loc" <(sed -r 's/xmlns=".*?"//' sitemaps.xml)

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

我也试过了:

代码语言:javascript
复制
xmllint --shell sitemaps.xml <<EOF
setrootns
xpath //defaultns:loc/text()
EOF

或者再次

代码语言:javascript
复制
xmllint --shell sitemaps.xml <<EOF
setrootns
cat //defaultns:loc
EOF

第一个给我(举个例子)

代码语言:javascript
复制
465  TEXT
    content=http://... 

使用截断的url

第二行给我“-”每2行...最后一行是"/>“..。

我开始变得非常紧张。:)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-06 19:38:21

我以前也做过类似的事情:

代码语言:javascript
复制
clean_xml_message=$(echo "$xml_message" | sed 's/xmlns/ignore/')

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

代码语言:javascript
复制
sed 's/></>\n</g' 

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

代码语言:javascript
复制
<loc>...</loc><loc>...</loc><loc>...</loc>

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

代码语言:javascript
复制
<loc>
...
</loc><loc>
...
</loc><loc>
...
</loc>

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

票数 4
EN

Stack Overflow用户

发布于 2013-02-07 01:18:36

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

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

所以,我这样做了:

代码语言:javascript
复制
xmllint  --xpath "//*[local-name()='loc']/text()" <(sed 's/<loc>/<loc>\n/g' sitemaps.xml)

而且它起作用了!

感谢所有人

票数 4
EN

Stack Overflow用户

发布于 2018-09-23 03:33:20

对于换行符问题,您可以查看以下代码库:

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

及其合并请求:

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

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

代码语言:javascript
复制
<?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>

您可以执行以下操作:

代码语言:javascript
复制
# xmllint --xpath "//name/text()" --xpath-separator "\n" example.xml

输出:

代码语言:javascript
复制
Hot Chocolate
Iced Tea
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14726951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档