получить значения с помощью XmlService в электронных таблицах Google

1

Это своего рода следующий вопрос о моей недавней задаче

Я должен реализовать притяжение XML-данных с помощью javascript в электронной таблице googles с помощью редактора сценариев. Я пытаюсь извлечь определенные значения из удаленного XML файла. Код может быть статическим (index?), Поскольку структура фиксирована, и время от времени будут меняться только значения.

XML выглядит следующим образом:

<?xml version='1.0' encoding='UTF-8'?>
<response xmlns="http://www.xovis.com/sensor-api/v2">
  <sensor-time timezone="Europe/Berlin">2017-12-18T17:00:02+01:00</sensor-time>
  <status>
    <code>OK</code>
  </status>
  <content>
    <elements>
      <element>
        <element-id>0</element-id>
        <element-name>count/element-name>
        <sensor-type>somesensor</sensor-type>
        <data-type>LINE</data-type>
        <from>2017-10-29T16:00:00+01:00</from>
        <to>2017-10-29T17:00:00+01:00</to>
        <resolution>ONE_HOUR</resolution>
        <measurements>
          <measurement>
            <from>2017-10-29T16:00:00+01:00</from>
            <to>2017-10-29T17:00:00+01:00</to>
            <values>
              <value label="fw">145</value>
              <value label="bw">1</value>
            </values>
          </measurement>
        </measurements>
      </element>
    </elements>
  </content>
  <sensor-info>
    <serial-number>D5:88:63:98:AA:E2</serial-number>
    <ip-address>192.168.1.99</ip-address>
    <name>somename</name>
    <group></group>
    <device-type>XYZ</device-type>
  </sensor-info>
</response>

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что у меня нет рабочей идеи о том, как копать глубже, чем на уровнях, для получения значений 145 и 1. Я думаю, что мне нужно использовать атрибут fw/bw.

          <value label="fw">145</value>
          <value label="bw">1</value>

Мой код до сих пор, который возвращает ошибку:

Не удается найти метод getChild(). (строка 53, файл "Код")

function xmlRead(){

  var url = 'SOMEURL';
  var responseXML = UrlFetchApp.fetch(url).getContentText();

  var outputDocument = XmlService.parse(responseXML);
  var ns = XmlService.getNamespace("http://www.xovis.com/sensor-api/v2");  

  var out = outputDocument.getRootElement().getChildren()[2].getChildren();

  var fw = out.getChild();

  Logger.log(out);


}
Теги:
dom
google-apps-script

1 ответ

2
Лучший ответ

Вы можете развернуться в XML, выбрав определенные дочерние элементы. В приведенном ниже примере я сделал его динамическим, предполагая, что могут быть несколько element и measurement узлов.

Сделано это быстро и не проверено. Могут быть некоторые опечатки, но механизм должен быть ясным, я думаю. Обязательно проверьте справочное руководство.

var xml = '<?xml version=\'1.0\' encoding=\'UTF-8\'?><response xmlns="http://www.xovis.com/sensor-api/v2"><sensor-time timezone="Europe/Berlin">2017-12-18T17:00:02+01:00</sensor-time><status><code>OK</code></status><content><elements><element><element-id>0</element-id><element-name>count</element-name><sensor-type>somesensor</sensor-type><data-type>LINE</data-type><from>2017-10-29T16:00:00+01:00</from><to>2017-10-29T17:00:00+01:00</to><resolution>ONE_HOUR</resolution><measurements><measurement><from>2017-10-29T16:00:00+01:00</from><to>2017-10-29T17:00:00+01:00</to><values><value label="fw">145</value><value label="bw">1</value></values></measurement></measurements></element></elements></content><sensor-info><serial-number>D5:88:63:98:AA:E2</serial-number><ip-address>192.168.1.99</ip-address><name>somename</name><group></group><device-type>XYZ</device-type></sensor-info></response>';

function myFunction() {
  var outputDocument = XmlService.parse(xml);
  var ns = XmlService.getNamespace("http://www.xovis.com/sensor-api/v2");
  var content = outputDocument.getRootElement().getChild('content', ns);
  var elements = content.getChild('elements', ns).getChildren('element', ns);

    for (var i = 0; i < elements.length; i++) { // Loop over each element
        Logger.log('Element ID: '+elements[i].getChild('element-id', ns).getText());
        var measurements = elements[i].getChild('measurements', ns).getChildren('measurement', ns);
        for (var j = 0; j < measurements.length; j++) { // Loop over each measurement
            Logger.log('Measurement from: '+measurements[j].getChild('from', ns).getText())
            var values = measurements[j].getChild('values', ns).getChildren('value', ns);
            for (var k = 0; k < values.length; k++) { // loop over each value
                Logger.log('Value: '+values[k].getText())
            }
        }
    }
}
  • 1
    Спасибо, но он возвращает ту же ошибку, что и раньше при использовании вашего кода: TypeError: Невозможно вызвать метод "getChild" со значением null. (строка 68, файл «Код») содержимое var также имеет значение null при работе в режиме отладки
  • 0
    Что происходит при отладке outputDocument.getRootElement() ?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню