xmlstarlet在<datarecord id =“4”>

时间:2017-06-20 09:11:25

标签: xml xmlstarlet

我在使用xmlstarlet方面非常新,还没有完全理解选择值的语法。从MBus-Meter我得到xml格式的电报,我需要选择一些特定的值。与

  

xmlstarlet sel -t -m&#34; // Value&#34; -v。 -n mbus-10.xml

我得到了所有价值观,但我需要选择&#34;价值&#34;和#34;时间戳&#34;在路径

  

DataRecord id =&#34; 2&#34;

在下面的例子中,它将是:
1450

2017-04-28T05:35:09

有人可以帮助我吗?

这是(缩写)xml文件:

<MBusData>
     <SlaveInformation>
        <Id>55993864</Id>
        <Manufacturer>DME</Manufacturer>
        <Version>64</Version>
        <ProductName></ProductName>
        <Medium>Heat: Outlet</Medium>
        <AccessNumber>134</AccessNumber>
        <Status>00</Status>
        <Signature>0000</Signature>
    </SlaveInformation>

    <DataRecord id="0">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>273</Value>
        <Timestamp>2017-04-28T05:35:09</Timestamp>
    </DataRecord>

    <DataRecord id="1">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>0</Value>
        <Timestamp>2017-04-28T05:35:09</Timestamp>
    </DataRecord>

    <DataRecord id="2">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>1450</Value>
        <Timestamp>2017-04-28T05:35:09</Timestamp>
    </DataRecord>

    <DataRecord id="3">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>231650</Value>
        <Timestamp>2017-04-28T05:35:09</Timestamp>
    </DataRecord>

</MBusData>

1 个答案:

答案 0 :(得分:1)

使用以下方法:

xmlstarlet sel -t -m "//DataRecord[@id='2']/*[self::Value or self::Timestamp]" -v . -n mbus-10.xml
  • //DataRecord[@id='2']/*[self::Value or self::Timestamp] - xpath表达式,选择ValueTimestamp个节点,这些节点是具有DataRecord属性值id节点的2节点的子节点{1}}

  • self - 仅包含上下文节点本身的轴

输出:

1450
2017-04-28T05:35:09