【问题标题】:Multiple matches of xml to single csv row (xmlstarlet)多个 xml 匹配到单个 csv 行 (xmlstarlet)
【发布时间】:2018-11-14 10:25:50
【问题描述】:

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

xmlstarletguiding 与:

一个文件中可以有多个--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 之类的解决方法很明显(这正是我所做的),但我想了解如何正确使用它以及导致这种不明显行为的原因。

【问题讨论】:

    标签: xml csv export-to-csv xmlstarlet


    【解决方案1】:

    您没有正确使用选项-m

    -m 选项是您从中提取值的 xpath(使用 -v 选项)。

    所以你的查询应该是:

    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 是搜索查询的根。

    【讨论】:

    • 是的,你是对的,现在一切都清楚了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多