УкраїнськаEnglishmRussian
Вход/Новый
В теме много сообщений

XML attr


Автор Сообщение
Сообщение создано: 18. 03. 2018 [23:45]
arcsin
Аркадий Кисель
Contributor
Создатель темы
Зарегистрирован(а) с: 17.02.2017
Сообщения: 77
привет форумчанам!
надо расппарсить структуру данных
HTML
<current>
<city id="704508" name="Kramatorsk">
<coord lon="37.56" lat="48.72"/>
<country>UA</country>
<sun rise="2018-03-18T03:35:32" set="2018-03-18T15:40:30"/>
</city>
<temperature value="-7.54" min="-7.54" max="-7.54" unit="metric"/>
<humidity value="88" unit="%"/>
<pressure value="1008.17" unit="hPa"/>
<wind>
<speed value="8.2" name="Fresh Breeze"/>
<gusts/>
<direction value="74.5015" code="ENE" name="East-northeast"/>
</wind>
<clouds value="92" name="overcast clouds"/>
<visibility/>
<precipitation mode="no"/>
<weather number="804" value="overcast clouds" icon="04n"/>
<lastupdate value="2018-03-18T21:19:45"/>
</current>

пытаюсь прочитать несуществующий аттрибут:
Current = SYS.XMLNode();
Current.load("тут текст что вверху");
wind_gusts = Current.childGet("wind").childGet("gusts").attr("value");

оно читает "0". а должно быть EVAL.
если вместо ожитаемого текста положить туда мусор, то оно тоже прочитает и везде будут нули. каким способом можно лаконично проверить прочитанное на адекватность? и заменить на EVAL?
Сообщение создано: 19. 03. 2018 [10:20]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"arcsin" wrote:

оно читает "0". а должно быть EVAL.

Кому должно?

"arcsin" wrote:

если вместо ожитаемого текста положить туда мусор, то оно тоже прочитает и везде будут нули. каким способом можно лаконично проверить прочитанное на адекватность?

Распечатать спарсеное, очевидно.

"arcsin" wrote:

и заменить на EVAL?

Какое отношение внутреннее представление EVAL имеет к дереву XML?

Learn, learn and learn better than work, work and work.
Сообщение создано: 19. 03. 2018 [11:38]
arcsin
Аркадий Кисель
Contributor
Создатель темы
Зарегистрирован(а) с: 17.02.2017
Сообщения: 77
"roman" wrote:

Распечатать спарсеное, очевидно.

пока все хорошо и приходит правильный XML все читает правильно. но если читаю несуществующий атрибут то логичнее получить на выходе не "0" а "EVAL" или какой-то сообщение об ошибке. потому что я не знаю это ноль действительный (0 метров в секунду, 0Амперов,0 градусов цельсия) или это значение недействительное типа EVAL. может есть метод проверки наличия атрибута? я такого в документации не нашел. чтобы при отсутствии атрибута записывать в переменную EVAL. иначе записывать действительное значение.
Сообщение создано: 19. 03. 2018 [12:01]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"arcsin" wrote:

пока все хорошо и приходит правильный XML все читает правильно. но если читаю несуществующий атрибут то логичнее получить на выходе не "0" а "EVAL" или какой-то сообщение об ошибке. потому что я не знаю это ноль действительный (0 метров в секунду, 0Амперов,0 градусов цельсия) или это значение недействительное типа EVAL. может есть метод проверки наличия атрибута? я такого в документации не нашел. чтобы при отсутствии атрибута записывать в переменную EVAL. иначе записывать действительное значение.

Прочитать как строку, что осуществляется по умолчанию, и проверить её размер, очевидно. А отсутствие атрибута XML, как и HTML, XHTML это просто пустая строка.

Learn, learn and learn better than work, work and work.
Сообщение создано: 17. 12. 2018 [22:36]
arcsin
Аркадий Кисель
Contributor
Создатель темы
Зарегистрирован(а) с: 17.02.2017
Сообщения: 77
Для понимания процесса преобразования строки в вещественное написал такую программу(в комментариях результат):
JAVASCRIPT
nothing="".toReal(); //0
space=" ".toReal(); //0
minus="-".toReal(); //0
exp="2.1E-02".toReal(); //0.021
without0=".314".toReal(); //0.314
pi="3.14".toReal(); //3.14
function toRealEVal1(str)
{
	if (str.length) 
		return str;
	else 
		return EVAL_REAL;
}
nothing1=toRealEVal1(""); //-1.79e+308==EVAL_REAL
function toRealEVal2(str)
{
	if (str.search("^(?:\+|\-)?(?:(?:\d+)|(?:\d+\.)|(?:\.\d+)|(?:\d+\.\d+)){1}(?:e(?:\+|\-)?\d+)?$","i") > -1 )
		return str;
	else 
		return EVAL_REAL;
}
nothing2=toRealEVal2(""); //-1.79e+308==EVAL_REAL
space2=toRealEVal2(" "); //-1.79e+308==EVAL_REAL
minus2=toRealEVal2("-"); //-1.79e+308==EVAL_REAL
exp2=toRealEVal2("2.1E-02"); //0.021
without02=toRealEVal2(".314"); //0.314
pi2=toRealEVal2("3.14"); //3.14

таким образом если преобразовывать всякий мусор с помощью toReal() получим 0. Если в частном случае будет или пустая строка или правильное число(например ответ с сайта), то достаточно функции типа toRealEVal1. Если нужно проконтролировать человека на ввод вещественного то нужна функция типа toRealEVal2 на основе регулярки.
регулярку нашел здесь: [url=]http://blog.kislenko.net/show.php?id=942[/url] возможен также вариант самодельного анализатора(вероятнее будет работать быстрее регулярки)
PS предлагаю разместить этот код цельно или по кусочкам в статье о JavaLikeCalc. возможно спрятать спойлером в районе описания функции toReal() хотябы первые 6 строк с примерами

[Сообщение редактировалось 1 раз(а), в последний раз 17.12.2018 в 22:49.]
Сообщение создано: 18. 12. 2018 [08:21]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"arcsin" wrote:

таким образом если преобразовывать всякий мусор с помощью toReal() получим 0. Если в частном случае будет или пустая строка или правильное число(например ответ с сайта), то достаточно функции типа toRealEVal1. Если нужно проконтролировать человека на ввод вещественного то нужна функция типа toRealEVal2 на основе регулярки.
регулярку нашел здесь: [url=]http://blog.kislenko.net/show.php?id=942[/url] возможен также вариант самодельного анализатора(вероятнее будет работать быстрее регулярки)
PS предлагаю разместить этот код цельно или по кусочкам в статье о JavaLikeCalc. возможно спрятать спойлером в районе описания функции toReal() хотябы первые 6 строк с примерами

Если это касается конечного пользователя среды визуализации то не вижу в этом смысла, поскольку он знать не должен про EVAL, а валидация ввода осуществляется исключительно по диапазону, скажем [100...1000], что в коде просто: rez = max(100,min(1000,str.toReal()));

И вообще, всё это не в тему форума!

Learn, learn and learn better than work, work and work.
Сообщение создано: 19. 12. 2018 [22:11]
arcsin
Аркадий Кисель
Contributor
Создатель темы
Зарегистрирован(а) с: 17.02.2017
Сообщения: 77
"roman" wrote:

Если это касается конечного пользователя среды визуализации то не вижу в этом смысла, поскольку он знать не должен про EVAL

Роман, мне кажется Вы меня не так поняли. Я хочу акцентировать внимание начинающих разработчиков на поведении функции toReal() в нестандартных ситуациях.

"roman" wrote:

, а валидация ввода осуществляется исключительно по диапазону, скажем [100...1000], что в коде просто: rez = max(100,min(1000,str.toReal()));

ИМХО это не валидация, а нелинейность вида "насыщение" (saturation). например вход toReal() передаем мусор например "стопитцот". после вашей функции rez==100.(врятли разработчик хотел получить в этой ситуации 100) даже если делать валидацию на основе диапазона, приведу более живой пример: края диапазона с разными знаками (-100...+100 температура на улице). я запрашиваю погодный сайт. он отвечает не так как обычно, и я присваиваю температуре t="".toReal(); t==0, хотя там пустота. и изза этого включается котел и греет дом. а на календаре июль.

"roman" wrote:

И вообще, всё это не в тему форума!

Не понял почему не в тему: У меня была проблема, Вы подсказали решение, (за что Вам спасибо!) и я выложил решение и мысли в этой же теме.
PS еще примеры
pims="3.14 m/s".toReal(); //3.14
pims2=toRealEVal2("3.14 m/s"); //-1.79e+308==EVAL_REAL т.е. надо регулярку подправить
Сообщение создано: 20. 12. 2018 [22:44]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"arcsin" wrote:

"roman" wrote:

Если это касается конечного пользователя среды визуализации то не вижу в этом смысла, поскольку он знать не должен про EVAL

Роман, мне кажется Вы меня не так поняли. Я хочу акцентировать внимание начинающих разработчиков на поведении функции toReal() в нестандартных ситуациях.

Для которой это типичное поведение, как и для системной atof(), и где нет места на чём акцентировать внимание, особенно если учесть, что мне, за всё время практики, таких странностей не понадобилось.

"arcsin" wrote:

"roman" wrote:

, а валидация ввода осуществляется исключительно по диапазону, скажем [100...1000], что в коде просто: rez = max(100,min(1000,str.toReal()));

ИМХО это не валидация, а нелинейность вида "насыщение" (saturation). например вход toReal() передаем мусор например "стопитцот". после вашей функции rez==100.(врятли разработчик хотел получить в этой ситуации 100) даже если делать валидацию на основе диапазона, приведу более живой пример: края диапазона с разными знаками (-100...+100 температура на улице). я запрашиваю погодный сайт. он отвечает не так как обычно, и я присваиваю температуре t="".toReal(); t==0, хотя там пустота. и изза этого включается котел и греет дом. а на календаре июль.

Глупо делать управление по ненадёжному источнику, а если он надёжный, XML спарсился то этот узел есть и данные там тоже должны быть нормальными плюс TCP целостность само проверяет.

"arcsin" wrote:

"roman" wrote:

И вообще, всё это не в тему форума!

Не понял почему не в тему: У меня была проблема, Вы подсказали решение, (за что Вам спасибо!) и я выложил решение и мысли в этой же теме.

По тому, что прошло много времени, а связи в тексте сообщения с темой "XML attr" нет!

Learn, learn and learn better than work, work and work.
Сообщение создано: 21. 12. 2018 [17:06]
arcsin
Аркадий Кисель
Contributor
Создатель темы
Зарегистрирован(а) с: 17.02.2017
Сообщения: 77
"roman" wrote:

Для которой это типичное поведение, как и для системной atof(), и где нет места на чём акцентировать внимание, особенно если учесть, что мне, за всё время практики, таких странностей не понадобилось.


Язык С и функция atof() вернет 0. Java, Pascal, Python ИМХО вызовут исключение. каждый язык поведет себя по своему. и это является особенность языка. получается JavaLikeCalc ведет себя как Си, но у Си нет EVal. возможно есть языки которые возвращают NaN.

"roman" wrote:

Глупо делать управление по ненадёжному источнику, а если он надёжный, XML спарсился то этот узел есть и данные там тоже должны быть нормальными плюс TCP целостность само проверяет.

конкретно с этим примером сайт может прислать XML стуктуру(не буду вдаваться в детали, но TCP пакет будет правильным) с кодом ошибки и сообщением об ошибке("Законился API ключ", "сильно часто запрашиваете для своего тарифа", просто пустая строка и .т.д.) и там не будет атрибутов с погодой.
Надежность понятие условное. наружный датчик тоже может сгнить, или быть утянутым на цветмет. но в этом случае АСУ поймет что температура == EVal, но не 0°С.

"roman" wrote:

По тому, что прошло много времени, а связи в тексте сообщения с темой "XML attr" нет!

Да, тема ушла в сторону, но и новую начинать не вижу смысла. Я бы переименовал если бы мог.

[Сообщение редактировалось 1 раз(а), в последний раз 21.12.2018 в 17:07.]
Сообщение создано: 03. 01. 2019 [09:23]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"arcsin" wrote:

Язык С и функция atof() вернет 0. Java, Pascal, Python ИМХО вызовут исключение. каждый язык поведет себя по своему. и это является особенность языка. получается JavaLikeCalc ведет себя как Си, но у Си нет EVal. возможно есть языки которые возвращают NaN.

И положено это в основу концепции, которая и отвечает на вопрос поведения toInt(), toReal():
В работе с различными типами данных язык использует механизм автоматического приведения типов в местах, где подобное приведение является целесообразным.

Что при приведении из строки в целое или вещественное, предусматривает 0 для всего нечислового, как знак, который легко проверить логически, который не выпадает из общих правил и что важно для подобных языков внутреннего программирования.

Согласен, что так выпадает сам "0", как число, но и разделять реальный 0 от не числа, что считается нулём как правило не нужно, и мне нужды не было. В JavaScript, взятого в значительной степени за основу, тут возвращается NaN, что нужно специально обрабатывать, а по мне — значительно лучше увидеть на экране таблицу с нулями, чем с NaN и при этом ничего особого не делать.

Т.е., выделение ситуации когда в строке не число считается внешним специфическим случаем верификации данных входного потока и предусматривает его особую обработку, как Вы и делали, иначе там станет ещё вопрос символа отделения дробной части вещественного, что ещё более неоднозначный вопрос, в смысле взаимодействия с внешними системами. А значит этому вопросу не место в документации на язык.

Разве только добавить отдельную функцию проверки на число прямо к строке, скажем isNaN(), раз это так или иначе ветвление и отдельная проверка.

Learn, learn and learn better than work, work and work.



15220