【问题标题】:XmlStarlet Querying XMLXmlStarlet 查询 XML
【发布时间】:2015-03-06 15:14:44
【问题描述】:

我有这个 xml 架构,你能帮我在 shell 脚本中使用 XMLStarlet 提取所有项目的值吗?

<transfer-matrix.xml>
    <transfers>
        <rows>
            <item>
                <item>Hungary</item>
                <item>Kharkov-KIPT-LCG2</item>
                <item>9882899680</item>
                <item>4</item>
                <item>1</item>
            </item>
            <item>
                <item>Spain</item>
                <item>Kharkov-KIPT-LCG2</item>
                <item>32945102817</item>
                <item>12</item>
                <item>2</item>
            </item>
            <item>
                <item>Finland</item>
                <item>Kharkov-KIPT-LCG2</item>
                <item>10737418240</item>
                <item>4</item>
                <item>0</item>
            </item>
            <item>...</item>
            <item>...</item>
            <item>...</item>
        </rows>
        <key>...</key>
    </transfers>
<params>...</params>
</transfer-matrix.xml>

我正在尝试以这种方式提取项目

outcome=`xml sel -T -t -m /transfer-matrix.xml/transfers/rows/item -s D:N:- "@item" -v "concat(@item,'|',item,'|',item,'|',item,'|',item,'|',item)" -n /usr/share/dashboard/xml/transfers-country.xml`

我的输出是:

|Hungary|Hungary|Hungary|Hungary|Hungary |Spain|Spain|Spain|Spain|Spain |Finland|Finland|Finland|Finland|Finland

我需要这样的格式

|Hungary|Kharkov-KIPT-LCG2|9882899680|4|1
|Spain|Kharkov-KIPT-LCG2|32945102817|12|2 
|Finland|Kharkov-KIPT-LCG2|10737418240|4|0

感谢您的帮助

【问题讨论】:

    标签: bash xmlstarlet


    【解决方案1】:

    你需要指定你想要的元素并在最后添加换行符,如下所示:

    OUTPUT=$(xmlstarlet sel -T -t -m /transfer-matrix.xml/transfers/rows/item -s D:N:- "@item" -v "concat(@item,'|',item[1],'|',item[2],'|',item[3],'|',item[4],'|',item[5],'\n')" transfers-country.xml)
    

    然后你可以通过echo -e得到想要的结果:

    $ echo -e "$OUTPUT"
    |Hungary|Kharkov-KIPT-LCG2|9882899680|4|1
    |Spain|Kharkov-KIPT-LCG2|32945102817|12|2
    |Finland|Kharkov-KIPT-LCG2|10737418240|4|0
    

    编辑:正如 npostavs 指出的那样,使用-n 标志会更好:

    $ xmlstarlet sel -T -t -m /transfer-matrix.xml/transfers/rows/item -s D:N:- "@item" -n -v "concat(@item,'|',item[1],'|',item[2],'|',item[3],'|',item[4],'|',item[5])" transfers-country.xml
    
    |Hungary|Kharkov-KIPT-LCG2|9882899680|4|1
    |Spain|Kharkov-KIPT-LCG2|32945102817|12|2
    |Finland|Kharkov-KIPT-LCG2|10737418240|4|0
    

    【讨论】:

    • 您可以使用 xmlstarlet 的 -n 选项直接输出换行符,而不是将 \n 放在 concat 表达式中(由 echo e 解释)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2014-05-17
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多