xml - 使用 xmlstarlet 进行 XPath 查询

标签 xml xpath xmlstarlet

我有类似于这个的 XML:

<orders>
        <orderCompleteRequestType>
                <Head>
                        <Aufnr>11111</Aufnr>
                </Head>
                <Register>
                        <Id>180</Id>
                        <value1>11</value1>
                        <value2>22</value2>
                </Register>
                <Register>
                        <Id>181</Id>
                        <value1>3</value1>
                        <value2>43</value2>
                </Register>
                <Register>
                        <Id>160</Id>
                        <value1>5</value1>
                        <value2>25</value2>
                </Register>
        </orderCompleteRequestType>
        <orderCompleteRequestType>
                <Head>
                        <Aufnr>22222</Aufnr>
                </Head>
                <Register>
                        <Id>280</Id>
                        <value1>1</value1>
                        <value2>12</value2>
                </Register>
                <Register>
                        <Id>160</Id>
                        <value1>12</value1>
                        <value2>7</value2>
                </Register>
                <Register>
                        <Id>281</Id>
                        <value1>94</value1>
                        <value2>22</value2>
                </Register>
        </orderCompleteRequestType>
</orders>

我想以 CSV 格式从每个“orderCompleteRequestType”结构中选择一些值:
  • 头/Aufrn
  • 注册/ID
  • 寄存器/值 1
  • 寄存器/值 2

  • 使用以下命令行时:
    xmlstarlet sel -T -t -m "/orders/orderCompleteRequestType" -v "Head/Aufnr" -o ";" -v "Register/Id" -o ";" -v "Register/value1" -o ";" -v "Register/value2" -n -n test.xml
    

    我得到:
    11111;180
    181
    160;11
    3
    5;22
    43
    25
    
    22222;280
    160
    281;1
    12
    94;12
    7
    22
    

    因此,首先是 Register/Id 节点的所有值,然后是所有 Register/value1,最后是所有 Register/value2,但我期望的是这样的:
    11111;180;11;22
    11111;181;3;43
    11111;160;5;25
    
    22222;280;1;12
    22222;160;12;7
    22222;281;94;22
    

    谁能帮帮我,因为我的大脑拒绝工作...

    最佳答案

    而不是匹配 orderCompleteRequestType , 考虑匹配 Register反而...

    xmlstarlet sel -T -t -m "/orders/orderCompleteRequestType/Register" -v "concat(../Head/Aufnr,';',Id,';',value1,';',value2)" -n test.xml
    

    输出...
    11111;180;11;22
    11111;181;3;43
    11111;160;5;25
    22222;280;1;12
    22222;160;12;7
    22222;281;94;22
    

    每个 orderCompleteRequestType 之间没有额外的换行符,但也许这没什么大不了的?如果是这样,编写一个 XSLT 并使用 xmlstarlet 调用它可能会更容易。

    关于xml - 使用 xmlstarlet 进行 XPath 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48664625/

    相关文章:

    c# - 自定义 resx 框架 Visual Studio 2010

    xml - 确定上下文节点在另一个节点集中的位置

    xml - 如何在 xmlstarlet 中执行条件语句

    c# - 反序列化 SOAP XML 响应

    php - eBay API 使用没有开始和结束时间的 getSellerList 调用获取所有产品

    ruby-on-rails - Rails JSON 和 XML 序列化包括微秒

    xml - 使用 xpath 获取第 n 个最接近的后代

    java - Xpath - 使用多个属性和部分文本的复合语句

    xmlstarlet 附加到 XML 中的节点

    xml - 如何使用 xmlstarlet 编辑具有相似结构元素的 xml 文件?