使用 xmlstarlet 选择多个元素

Bow*_*owi 3 xml xmlstarlet

由于我在其他地方找不到解释的示例,因此我以问答形式分享我的发现。

考虑这个学生名单(pupils.xml):

<pupils>
    <pupil>
        <firstName>Adam</firstName>
        <lastName>Amith</lastName>
        <birthDate>2000-01-01</birthDate>
    </pupil>
    <pupil>
        <firstName>Berta</firstName>
        <lastName>Bmith</lastName>
        <birthDate>2000-01-02</birthDate>
    </pupil>
    <pupil>
        <firstName>Caesar</firstName>
        <lastName>Cmith</lastName>
        <birthDate>2000-01-03</birthDate>
    </pupil>
    <pupil>
        <firstName>Doris</firstName>
        <lastName>Dmith</lastName>
        <birthDate>2000-01-04</birthDate>
    </pupil>
</pupils>
Run Code Online (Sandbox Code Playgroud)

我如何选择每个学生的两个子属性以获得如下列表:

Adam Amith
Berta Bmith
Caesar Cmith
Doris Dmith
Run Code Online (Sandbox Code Playgroud)

Bow*_*owi 6

得到这个的命令是

xmlstarlet select -T -t -m "//pupil" -v "firstName" -o " " -v "lastName" -n pupils.xml
Run Code Online (Sandbox Code Playgroud)

并带来:

Adam Amith
Berta Bmith
Caesar Cmith
Doris Dmith
Run Code Online (Sandbox Code Playgroud)
  • -T将输出切换到text
  • -t -m "//pupil" -v "firstName" -o " " -v "lastName" -n定义一个模板
    • -m "//pupil" 匹配每个pupil节点
    • -v "firstName" 打印子节点的值firstName(当前匹配节点的子节点)
    • -o " " 打印空白
    • -v "lastName"(往上看)
    • -n打印换行符
  • pupils.xml提供输入文件

该文档提供了更高级的参数。