Мне нужно разобрать этот 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);
}
Я считаю вашу цель следующим образом.
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.
}
Что касается пространства имен, эти темы могут быть полезны.
Есть идеи, почему var res2 = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("DIC", ns2).getText();
не работает?
@Radek Спасибо за ответ. Я приношу извинения за неудобства. Я думаю, что в вашей текущей проблеме для var res2 = root.getChild("Odpoved", ns1).getChild("VBAS", ns2).getChild("DIC", ns2).getText();
может быть связано с URL-адресом для получения данных XML. Поэтому я добавил еще один образец сценария для вашего дополнительного вопроса. Не могли бы вы подтвердить это? Если это не тот результат, которого вы ожидаете, я еще раз прошу прощения.
вы ответили на мой вопрос своей первой версией своего ответа. Обычно я принимаю ответ, когда полностью его понимаю. Большое спасибо за ваше терпение.
Как лучше всего узнать в сценарии, получил ли ребенок значение?
@Radek Спасибо за ответ. Я рад, что ваша проблема была решена. По поводу вашего нового вопроса What is the best way to find out in the script whether a child got a value?
, к сожалению, на текущем этапе у меня нет на него четкого ответа. Прошу прощения, что не могу ответить на все ваши вопросы. Это из-за моего слабого мастерства. Я глубоко извиняюсь за это. Я хотел бы учиться больше и больше. Когда я нашел лучший способ для достижения этого, я хотел бы сказать вам.
Я обнаружил, что var dic2 = root.getChild("Odpoved", ns_are).getChild("VBAS", ns_d).getChildText("DIC", ns_d);
не выдает ошибку. Если элемент не имеет значения, переменная будет нулевой.
хм, так что я сделал именно то, что вы, за исключением того, что я не использовал пространство имен. Вы сказали, что «в этом случае» требуется пространство имен. Не могли бы вы объяснить, почему необходимо использовать пространство имен и почему мы должны использовать 2 разных?