0
Not a bug

Не работает код не создается XML объект

Vyacheslav Shorin 1 month ago in Bugs and problems updated by Vladimir Ovchinnikov 1 month ago 12

Не создается XML объект  из строки, что я не так делаю

var in_sText = '<?xml version="1.0" ?><command_result><param name="protocol_version" value="4"/></command_result>';

var in_sText_xml = new XML(in_sText);

IR.Log("in_sTextXML " + in_sText_xml);

GOOD, I'M SATISFIED
Satisfaction mark by Vyacheslav Shorin 1 month ago
Under review

Добрый день.

Объект XML нельзя вывести в лог. Однако можно так:


var in_sText = '<?xml version="1.0" ?><command_result><param_name>"protocol_version"</param_name><value>"4"</value></command_result>';
var in_sText_xml = new XML(in_sText);
IR.Log(in_sText_xml.command_result["param_name"]);

Документация тут.https://dev.iridi.com/Systems_API#XML

Вы поменяли XML строку, оборудование возвращает в таком формате
<?xml version="1.0" ?><command_result><param name="protocol_version" value="4"/></command_result>,
что является корректным синтаксисом XML

как получить name и value?

Тэг

<param name="protocol_version" value="4"/>

пустого элемента, он равен null.

Рабочий код в JS 
var doc = '<?xml version="1.0" ?><command_result><param name="protocol_version" value="4" /><param name="protocol_type" value="5" /></command_result>'; 

var parser = new DOMParser(); 

var xml = parser.parseFromString(doc, "text/xml"); 

var mydata = xml.getElementsByTagName("command_result")[0].childNodes;
var result = mydata[0]; 

console.log(result.getAttribute("name")); 

console.log(result.getAttribute("value"));

возвращает
protocol_version
4

Как в студии реализовать?

В приведённом коде получаете имя тэга, т. е. ищете строку. Проще тогда парсить строку до (или вместо) создания объекта XML.

В i3 pro используется спецификация ECMAScript Edition 3, поэтому DOMParser недоступен.

Я уже догадался, что ДОМпарсер недоступен в студии
Т.е. единственный вариант получить данные, просто парсить строку, не обращая внимания, что это структурированный XML?

Да.

Можно при получении null в элементе обратно преобразовать в строку и парсить. Если у вас в получаемых данных всегда есть пустые элементы в объекте XML, тогда лучше сразу парсить строку.

IR.AddListener(IR.EVENT_RECEIVE_TEXT, m_oDevice, function(in_sText){

// 1 сортируем по полочкам

in_sText = new XML(in_sText)

// 2 нло

var l_iIndex = 0;

var l_bNotUndefined = true;

// 3 пишем в каналы новые сведения

IR.Log("l_bNotUndefined " + l_bNotUndefined);

IR.Log("in_sText " + in_sText);

while(l_bNotUndefined){

if(in_sText.command_result["param"][l_iIndex]["@name"] != undefined){

var l_sNowItemName = in_sText.command_result["param"][l_iIndex]["@name"];

var l_sNowItemValue = in_sText.command_result["param"][l_iIndex]["@value"];

Это код из модуля с вашего сайта https://iridi.com/ru/download/software/v2/module/dune_hd/

он раньше работал, исходя из того что он выложен на вашем сайте, а сейчас возвращает ошибку
Вы что-то поменяли в студии ?

Ладно я уже понял, раньше студия не обращала внимание на эту ошибку и обрабатывала данные, тепер она стала лучше и данные уже не обрабатывает, а выдает ошибку:)

Этот код для i2Control. К тому же код вырван из контекста.

Возможно в контексте вашего первоначального вопроса вы хотели получить нечто подобное:

var in_sText = '<?xml version="1.0" ?><command_result><param name="protocol_version" value="4"></command_result>';
in_sText = new XML(in_sText)
var l_iIndex = 0;
if(in_sText.command_result["param"][l_iIndex]["@name"] != undefined)
{
var l_sNowItemName = in_sText.command_result["param"][l_iIndex]["@name"];
IR.Log(l_sNowItemName);
}

Однако это усложнение кода, т. к. проще и быстрее парсить строку.