This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Match nth item of a string
#1
I'm looking for a way to grab the value of the 3th parent and 2th child item of a string. Below an example of the data i get. The value i need is marked in red. It's not possible to use the id's as they change all the time. With css it's done like this item:nth-child(3) item:nth-child(2) but how is it done in Lua?

<values>
  <item id='0x8764bc'>
      <item id='0x87676c'>
        <value>32.5°C</value>
      </item>
      <item id='0x87de1c'>
        <value>28.6°C</value>
      </item>
      <item id='0x87de64'>
        <value>28.4°C</value>
      </item>
      <item id='0x876724'>
        <value>62.7°C</value>
      </item>
  </item>
  <item id='0x876504'>
      <item id='0x8b7ab4'>
        <value>Aan</value>
      </item>
      <item id='0x87e0d4'>
        <value>Aan</value>
      </item>
  </item>
  <item id='0x8765dc'>
      <item id='0x878554'>
        <value>Uit</value>
      </item>
      <item id='0x861b84'>
        <value>Aan</value>
      </item>
      <item id='0x861bcc'>
        <value>Aan</value>
      </item>
      <item id='0x87850c'>
        <value>Aan</value>
      </item>
  </item>
</values>
Reply
#2
It makes more sense to find values by ID instead of position inside of the XML that can potentially change. Try this:
Code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
data = [[ <values>   <item id='0x8764bc'>       <item id='0x87676c'>         <value>32.5°C</value>       </item>       <item id='0x87de1c'>         <value>28.6°C</value>       </item>       <item id='0x87de64'>         <value>28.4°C</value>       </item>       <item id='0x876724'>         <value>62.7°C</value>       </item>   </item>   <item id='0x876504'>       <item id='0x8b7ab4'>         <value>Aan</value>       </item>       <item id='0x87e0d4'>         <value>Aan</value>       </item>   </item>   <item id='0x8765dc'>       <item id='0x878554'>         <value>Uit</value>       </item>       <item id='0x861b84'>         <value>Aan</value>       </item>       <item id='0x861bcc'>         <value>Aan</value>       </item>       <item id='0x87850c'>         <value>Aan</value>       </item>   </item> </values>]] function starttag(p, tag, attrs)   if tag == 'item' then     id = attrs.id   elseif tag == 'value' then     value = true   end end function endtag(p, tag)   if tag == 'item' then     id = nil   elseif tag == 'value' then     value = nil   end end function text(p, tdata)   if value and id then     values[ id ] = tdata     value = nil   end end values = {} require('lxp').new({   StartElement = starttag,   EndElement = endtag,   CharacterData = text, }):parse(data) log(values)
Reply
#3
With this function i got a nice result of the items with their values but as the ID's change with every new connection made i can't use them.
Also the sorting is different using this function and with the raw data it's not. Below to examples with different ID's as you can see.

* table:
["0xe9fd3c"]
* string: 3144h
["0xe9a164"]
* string: 0.01 V
["0xde6bb4"]
* string: Aan
["0xe5a494"]
* string: Verwarmen
...


* table:
["0xee5dc4"]
* string: 3144h
["0xeb74cc"]
* string: 31 Hz
["0xebf184"]
* string: 1070
["0xf1a3f4"]
* string: 17593.1 kWh
...
Reply
#4
This one is solved by Erwin van der Zwart already. He send me this solution that create a table with sorted numbering.

function text(p, tdata)
  if value and id then
table.insert(values, tdata)
    value = nil
  end
end
Reply


Forum Jump: