xml与单个csv行的多个匹配(xmlstarlet)

维克托霍

XML示例:

<hosts>
    <host>
        <name>Server A</name>
        <status>0</status>
        <groups>
            <group>
                <name>Discovered hosts</name>
            </group>
        </groups>
        <interfaces>
            <interface>
                <ip>10.1.2.3</ip>
            </interface>
        </interfaces>
    </host>
    <host>
        <name>Server B</name>
        <status>0</status>
        <groups>
            <group>
                <name>Discovered hosts</name>
            </group>
        </groups>
        <interfaces>
            <interface>
                <ip>10.1.2.4</ip>
            </interface>
        </interfaces>
    </host>
</hosts>

我尝试将条目导出为CSV文件,如下所示:

Discovered hosts,Server A,10.1.2.3,0
Discovered hosts,Server B,10.1.2.4,0

xmlstarlet引导用:

单个模板中可以有多个--match,-copy-of,-value-of等选项。可以使用以下XSLT类似物来说明应用命令行模板的效果

xml sel -t -c“ xpath0” -m“ xpath1” -m“ xpath2” -v“ xpath3” \ -t -m“ xpath4” -c“ xpath5”

但是我的结果与预期的不同:

$ xmlstarlet sel -t \
-m "//host/groups/group/name" -v . -o "," \
-m "//host/name" -v . -o "," \
-m "//host/interfaces/interface/ip" -v . -o "," \
-m "//host/status" -v . -n sample.xml 
Discovered hosts,Server A,10.1.2.3,0
0
10.1.2.4,0
0
Server B,10.1.2.3,0
0
10.1.2.4,0
0
Discovered hosts,Server A,10.1.2.3,0
0
10.1.2.4,0
0
Server B,10.1.2.3,0
0
10.1.2.4,0
0

显然可以使用grep类似的解决方法(这正是我所做的),但是我想了解如何正确使用它以及导致这种明显行为的原因。

橄榄

您没有-m正确使用该选项

-m选项是您从中提取值(带有-v选项)的xpath

因此,您的查询应为:

xmlstarlet sel -t -m "hosts/host" \
                  -v "groups/group/name" -o "," \
                  -v "name" -o "," \
                  -v "interfaces/interface/ip" -o "," \
                  -v "status" \
                  -n file

hosts/host搜索查询的根目录在哪里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章