xmlstarlet - 使用 xmlstarlet 重复属性

标签 xmlstarlet

我正在尝试使用 XMLstarlet 将一些数据从 XML 格式转换为 CSV。我的数据格式为

<!-- mydata.xml -->
<alldata>
    <data id="first">
        <coord><x>0</x><y>5</y></coord>
        <coord><x>1</x><y>4</y></coord>
        <coord><x>2</x><y>3</y></coord>
    </data>
    <data id="second">
        <coord><x>3</x><y>2</y></coord>
        <coord><x>4</x><y>1</y></coord>
        <coord><x>5</x><y>0</y></coord>
    </data>
</alldata>

我想将这些数据格式化为三列“id”、“x”和“y”以获得:

first;0;5
first;1;4
first;2;3
second;3;2
second;4;1
second;5;0

我对 XMLstarlet 的尝试失败了,这表明我并不真正理解我在做什么。

xml sel -T -t -m/alldata/data -v "@id"-m/alldata/data/coord -v "concat(x,';',y)"-n mydata. xml

给我:

first0;5
1;4
2;3
3;2
4;1
5;0
second0;5
1;4
2;3
3;2
4;1
5;0

这不是我想要或期望的。是否可以修改我的查询以获得所需的输出?

最佳答案

-m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)"

主要问题是-m /alldata/data/coord :这匹配所有 coord整个文档中的元素,您真正想要的只是 coord当前data下元素:

-m /alldata/data -v "@id" -m coord -v "concat(x,';',y)"

您还想要 id在每一行,所以你需要进入内部循环:

-m /alldata/data -m coord -v "concat(../@id,';',x,';',y)"

此时,拥有 2 个嵌套循环没有任何好处,因此我们可以简化:

xml sel -T -t -m /alldata/data/coord -v "concat(../@id,';',x,';',y)" -n mydata.xml

关于xmlstarlet - 使用 xmlstarlet 重复属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422650/

相关文章:

xml - xmlstarlet-通过其参数名称更新特定节点上的值

xml - 用于更新部分 XML 元素值的 Bash 脚本

xmlstarlet - 如何使用 xmlstarlet 打印 XPath 匹配的位置?

xml - 使用XMLStarlet插入1000多个节点和属性-运行缓慢

xmlstarlet - 如何使用 XMLStarlet 在另一个元素之后直接插入一个元素?

xmlstarlet 根据条件选择值

xpath - 为什么 xmlstarlet 说没有 'ends-with' 函数?

xmlstarlet 解析器错误 : Entity '*' not defined

command-line-interface - XMLStarlet 不选择任何内容

xml - 使用 xmlstarlet 提取数据