Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
输出行的xmllint问题_Xml_Bash_Xml Parsing_Sitemap_Xmllint - Fatal编程技术网

输出行的xmllint问题

输出行的xmllint问题,xml,bash,xml-parsing,sitemap,xmllint,Xml,Bash,Xml Parsing,Sitemap,Xmllint,我知道我的问题包括两个问题 首先,我想使用xmllint输出“loc”内容标记。我加载的站点地图有一个xmlns=“…” 在xmllint shell上,我需要执行以下操作: setrootns xpath //defaultns:loc 这很有效。。。没问题。但我需要在bash脚本中执行此操作 (AFAIK)xmllint没有选择告诉“走吧,setrootns”,所以我不能这样做: xmllint --xpath "//loc" sitemaps.xml # or xmllint --xpa

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

首先,我想使用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属性,然后就没有可使用的os ns了:

xmllint --xpath "//loc" <(sed -r 's/xmlns=".*?"//' sitemaps.xml)
使用截断的url

第二个给我“----”每2行。。。最后一行有一个“/>”

我开始非常紧张……:)

如果你能找到任何解决办法,我非常感谢


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

我曾经做过类似的事情:

clean_xml_message=$(echo "$xml_message" | sed 's/xmlns/ignore/')
最终你可以试着把新词放回去:

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

sed的/>\n@BrnVrn是对的,我只需要在标记后面加上“\n”

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

所以,我这样做了:

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

xmllint--xpath//*[local-name()='loc']/text()”有关换行符问题,您可以查看以下报告:

及其合并请求:

基本上,它让您可以在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>
输出:

Hot Chocolate
Iced Tea

使用更好的XML shell怎么样?请参阅.My始终使用输入文件的名称空间前缀作为未知前缀,并使用query@choroba目标是使用xmllint;)但是,是的,我想我会使用另一个工具…这是grep-Eio“(.*)”sitemaps.xml | sed-r的///g,但目标是使用xmllint选项:)我不明白你的意思,我意识到这是你给出的一个很好的解决方案。我尝试了这个,非常感谢,检查了我的答案,我发现了如何不检查名称空间,我在标记后面附加了\n。
<loc>...</loc><loc>...</loc><loc>...</loc>
<loc>
...
</loc><loc>
...
</loc><loc>
...
</loc>
xmllint  --xpath "//*[local-name()='loc']/text()" <(sed 's/<loc>/<loc>\n/g' sitemaps.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