Как разобрать (этот) xml с помощью Google Script

Мне нужно разобрать этот xml с помощью Google Script. jsonformatter.org говорит мне, что XML действителен

Я хочу получить текст ICO, но //var ico = root.getChild('Ares_odpovedi').getChild('Odpoved').getChild('VBAS').getChild('ICO').getText(); выдает ошибку

Полный код

function getARES() {
var url = 'https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?'
    + 'ico=06018025'
    + '&xml=1';
var response = UrlFetchApp.fetch(url);

var responseText = response.getContentText(); //.replace(/D:/g,'');

var document = XmlService.parse(responseText);
var root = document.getRootElement();

var ico_tmp0 = root.getName();                 // value is "Ares_odpovedi"
var ico_tmp1 = root.getContentSize();          // value is 3         
var ico_tmp2 = root.getChild('Ares_odpovedi'); // value is null
var ico_tmp3 = root.getChild('Odpoved');       // value is null
//var ico = root.getChild('Ares_odpovedi').getChild('Odpoved').getChild('VBAS').getChild('ICO').getText();
//var ico = root.getChild('Odpoved').getChild('VBAS').getChild('ICO').getText();

Logger.log(response);
Logger.log(" ");
Logger.log(responseText);
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю вашу цель следующим образом.

  • Вы хотите получить текст ICO с помощью скрипта Google Apps.

В этом случае необходимо использовать пространство имен при использовании getChild. Когда это отражается на вашем сценарии, получается следующее.

Модифицированный скрипт:

function getARES() {
  var url = 'https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?'
      + 'ico=06018025'
      + '&xml=1';
  var response = UrlFetchApp.fetch(url);

  var responseText = response.getContentText(); //.replace(/D:/g,'');

  var document = XmlService.parse(responseText);
  var root = document.getRootElement();
  
  // I modified below script.
  var ns1 = XmlService.getNamespace("/ares/xml_doc/schemas/ares/ares_answer_basic/v_1.0.3");
  var ns2 = XmlService.getNamespace("/ares/xml_doc/schemas/ares/ares_datatypes/v_1.0.3");
  var res = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("ICO", ns2).getText();
  Logger.log(res)
}
  • Когда запускается вышеуказанный скрипт, извлекается 06018025.
  • Когда http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=27074358&xml=1 используется в качестве URL-адреса UrlFetchApp.fetch, получается 27074358.

Использованная литература:

Добавлен:

Из вашего ответа Any idea why var res2 = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("DIC", ns2).getText(); does not work? я заметил, что ваш вопрос был изменен.

В своем вопросе вы хотели получить значение ICO. Но в случае получения значения DIC необходимо проверить структуру XML. Потому что в вашем сценарии в вашем вопросе XML из var url = 'https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?' + 'ico=06018025' + '&xml=1'; не включает значение DIC. Я думаю, что это причина вашей проблемы.

Если вы хотите получить значение DIC из http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=27074358&xml=1, используйте следующий скрипт.

Модифицированный скрипт:

function getARES() {
  var url = 'http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=27074358&xml=1';  // <--- Modified
  var response = UrlFetchApp.fetch(url);
  var responseText = response.getContentText(); //.replace(/D:/g,'');
  var document = XmlService.parse(responseText);
  var root = document.getRootElement();
  var ns1 = XmlService.getNamespace("/ares/xml_doc/schemas/ares/ares_answer_basic/v_1.0.3");
  var ns2 = XmlService.getNamespace("/ares/xml_doc/schemas/ares/ares_datatypes/v_1.0.3");
  var res = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("DIC", ns2).getText();  // <--- Modified
  Logger.log(res)  // In this case, CZ27074358 is retrieved.
}

Примечание:

Что касается пространства имен, эти темы могут быть полезны.

хм, так что я сделал именно то, что вы, за исключением того, что я не использовал пространство имен. Вы сказали, что «в этом случае» требуется пространство имен. Не могли бы вы объяснить, почему необходимо использовать пространство имен и почему мы должны использовать 2 разных?

Radek 23.12.2020 14:07

Есть идеи, почему var res2 = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("DIC", ns2).getText(); не работает?

Radek 23.12.2020 14:30

@Radek Спасибо за ответ. Я приношу извинения за неудобства. Я думаю, что в вашей текущей проблеме для var res2 = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("DIC", ns2).getText(); может быть связано с URL-адресом для получения данных XML. Поэтому я добавил еще один образец сценария для вашего дополнительного вопроса. Не могли бы вы подтвердить это? Если это не тот результат, которого вы ожидаете, я еще раз прошу прощения.

Tanaike 24.12.2020 01:35

вы ответили на мой вопрос своей первой версией своего ответа. Обычно я принимаю ответ, когда полностью его понимаю. Большое спасибо за ваше терпение.

Radek 24.12.2020 09:49

Как лучше всего узнать в сценарии, получил ли ребенок значение?

Radek 24.12.2020 09:53

@Radek Спасибо за ответ. Я рад, что ваша проблема была решена. По поводу вашего нового вопроса What is the best way to find out in the script whether a child got a value?, к сожалению, на текущем этапе у меня нет на него четкого ответа. Прошу прощения, что не могу ответить на все ваши вопросы. Это из-за моего слабого мастерства. Я глубоко извиняюсь за это. Я хотел бы учиться больше и больше. Когда я нашел лучший способ для достижения этого, я хотел бы сказать вам.

Tanaike 25.12.2020 01:46

Я обнаружил, что var dic2 = root.getChild("Odpoved", ns_are).getChild("VBAS", ns_d).getChildText("DIC", ns_d); не выдает ошибку. Если элемент не имеет значения, переменная будет нулевой.

Radek 27.12.2020 11:49

Другие вопросы по теме