Получить значения с помощью XmlService в электронных таблицах Google
Это своего рода вопрос о моей недавней задаче
Я должен реализовать извлечение данных XML с помощью JavaScript в электронной таблице Google с помощью редактора сценариев. Я пытаюсь извлечь определенные значения из удаленно хранимого XML-файла. Код может быть статическим (индекс?), Поскольку структура является фиксированной, и время от времени изменяются только значения.
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);
}
1 ответ
Вы можете углубиться в 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())
}
}
}
}