XML attr
Автор |
Сообщение |
Сообщение создано: 18. 03. 2018 [23:45]
|
arcsin
Аркадий Кисель
Contributor
Создатель темы
Зарегистрирован(а) с: 17.02.2017
Сообщения: 77
|
привет форумчанам!
надо расппарсить структуру данных
<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
|
Для понимания процесса преобразования строки в вещественное написал такую программу(в комментариях результат):
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.
|
|
|