Find Element == null ? NullReferenceException() : Нашли Html элемент

Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
Url: yandex .ru

Поиск элемента.png

Пример кода:
FindElementByXPath:
    Tab tab = instance.ActiveTab;
    // Исправный путь => //a[starts-with(@class,'home-link')]/span[starts-with(@class,'news__item-inner')]/span[starts-with(@class,'news__item-content')]   

    //-----------------------------------------------
    // Вариант 1 - HtmlElement
    //-----------------------------------------------
    HtmlElement he = null;
    he = tab.FindElementByXPath("//ad[starts-with(@class,'home-link')]/span[starts-with(@class,'news__item-inner')]/span[starts-with(@class,'news__item-content')]", 0);

    if(he.InnerText == string.Empty ) //he.IsVoid == True, True!
        return "Empty";
    if(he.IsVoid)
        return "IsVoid: True";
    else if(he.IsNull)
        return "IsNull: True";
    else if(he == null)
        return "he = null";

    return "-1";
    //-----------------------------------------------
    // Вариант 2 - HtmlElementCollection
    //-----------------------------------------------
    HtmlElementCollection he = null;
    he = tab.FindElementsByXPath("//ad[starts-with(@class,'home-link')]/span[starts-with(@class,'news__item-inner')]/span[starts-with(@class,'news__item-content')]");

    project.SendErrorToLog(he.IsVoid.ToString(), true);

    foreach(var val in he){

        project.SendErrorToLog("IsVoid: "+val.IsVoid.ToString() + "; IsNull: "+val.IsNull.ToString(), true);
        project.SendErrorToLog(val.InnerText, true);
        return "1";
    }

    return "-1";
Поиск коллекции элементов.png

Тоже самое и с другими методами: FindElementByAttribute();

Поиск элемента (FindElementByAttribute).png

Примечание:
Наверное, я привык работать с HAP, и когда объект отсутствует, мне удобно строить логику, опираясь на то, что это null (ничто), а не void (пусто), к примеру я делаю монитор контейнера, на наличие в нем текста, но если путь не исправлен?

Эхо: Умник, если ты привык работать с HAP, то и работай дальше с ней))!
Отвечу: Внутренними методами, порой быстрее делать разработку, нежели подключать что-то...
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
очень интересно написано, но ничего непонятно.

За что голосуем то ?
Чтобы не найденный объект, был не VOID, а NULL

К примеру, следим за курсом $, там зеленная и красная стрелочка, но бывает и нет её (означает, что изменений нет), но если путь кривой, то логика будет работать по: изменений нет.

К примеру, следим за наличием комментария в контейнере, //div/span[contains(., 'какой-то текст')], если нет такого комментария, возвращает VOID, но если изменился путь: //div/div/span, то также покажет VOID, что в принципе глупо, так как NullReferenceException().
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Серьезно ? Вот так взять и резко все поменять ? а что будет с миллионами шаблонами уже написанными и работающими ?
Тем более с чего такая уверенность, что разработчики ЗенноПостера имеют отношение к данной концепции ? это надо искать тех кто .Net платформу разрабатывает. все вопросы к ним :-)
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
Серьезно ? Вот так взять и резко все поменять ? а что будет с миллионами шаблонами уже написанными и работающими ?
Тем более с чего такая уверенность, что разработчики ЗенноПостера имеют отношение к данной концепции ? это надо искать тех кто .Net платформу разрабатывает. все вопросы к ним :-)
Ни первая, ни вторая часть, вашего сообщения не мне не понятна, просто набор каких-то без смысловатых слов.

1.
а что будет с миллионами шаблонами уже написанными и работающими ?
Вопрос: А при чем здесь миллионы уже ранее написанных шаблонов?
Примечание: Ведь апдейт не вносит изменения в старые релизы, но ведь когда решаю обновиться, подхожу к этому осознано.
+ команда ZennoLab потрясающе выкатывает релизы, где подробно описано, что вошло в билд.

2.
ЗенноПостера имеют отношение к данной концепции ? это надо искать тех кто .Net платформу разрабатывает. все вопросы к ним
Примечание:
Phoenix78
, вы явно не понимаете о чем идет речь. Исключение NullReferenceException, сообщает об "попытке использовать пустую ссылку, т.е. ссылку, которая не указывает ни на один из объектов". Подробнее: с. 420 Часть I. Язык С# (Глава: 13, Обработка исключительных ситуаций. Книга: С# 4.0 полное руководство Герберт Шилдт)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ну если уж по чесноку, то все что у вас тут написано, то это тоже набор бессмысленных слов. одна демагогия. Абсолютно все тупо проверяют полученный элемент как ( !he.IsVoid & !he.IsNull )
и кому какая разница будет ли возвращаться IsVoid или IsNull ? Абсолютно всем до лампочки эти различия.

А насчет слежения за элементами , так это совсем другая история. тут надо просто правильно составить xpath. когда надо найти общий путь для различных ситуаций, а когда наоборот надо составить уникальный путь для элемента.
у меня бот следит за десятком различных сообщений разные по структуре , но возникающие в одном логическом диве. и никаких проблем с путаницей IsVoid или IsNull даже в голову не приходило.

Ну а менять саму систему C# , только потому что кто то не умеет работать с xpath и правильно обработать полученный результат... ну это конечно серьезная заявка.
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
ну если уж по чесноку, то все что у вас тут написано, то это тоже набор бессмысленных слов. одна демагогия. Абсолютно все тупо проверяют полученный элемент как ( !he.IsVoid & !he.IsNull )
и кому какая разница будет ли возвращаться IsVoid или IsNull ? Абсолютно всем до лампочки эти различия.

А насчет слежения за элементами , так это совсем другая история. тут надо просто правильно составить xpath. когда надо найти общий путь для различных ситуаций, а когда наоборот надо составить уникальный путь для элемента.
у меня бот следит за десятком различных сообщений разные по структуре , но возникающие в одном логическом диве. и никаких проблем с путаницей IsVoid или IsNull даже в голову не приходило.

Ну а менять саму систему C# , только потому что кто то не умеет работать с xpath и правильно обработать полученный результат... ну это конечно серьезная заявка.
надо просто правильно составить xpath
я говорю кошка, вы говорите стрижиная*HAHA* вы продолжаете? из вашей конструкции if(!he.IsVoid & !he.IsNull) - метод !he.IsNull, в данном случае беЗполезен, так как вам не вернется null, в случае отсутствия объекта, в начале поста я показал, что возвращается: "" || string.Empty || Void, когда есть ошибка в пути.

Ошибка в пути:
he = tab.FindElementByXPath("//badtag", 0); //failed xPath

if(he.InnerText == string.Empty ) // True
или
if(he.IsVoid == True) // True

// что противоречит, базовому исключению CLR
// NullReferenceException - попытка использовать пустую ссылку, т.е. ссылку, которая не указывает ни на один из объектов.
Phoenix78, закрыли тему :dk:
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Ну и отлично. Самоустранился. Мне это нисколько не мешает :-)

Вот разработчики такие сидели, репу чесали , думу думали, а как бы нам заюзать всю мощь C#, но вот более приближенно к конечному пользователю....
и пришла им классная идея, сделать свои функции , после которых не надо городить кучу проверок на всякие там нулевые объекты , выставлять кучу ловушек всяких исключений типа NullReferenceException
вот дорогой пользователь вызывай FindElementByXPath и делай простую проверку по любому параметру , мы уже создали и вернули тебе безопасный объект , все для твоего удобства . ну там куча восторженных последователей, куча продаж...
и в один прекрасный момент появляется .... ну даже незнаю какой эпитет тут применить... ну пусть будет Последователь Полного Руководства Герберта Шилдта , и так с порога претензию бросает , А я вот книжку прочитал умную и знаете ЧТО, а вы то неправильно свою функцию написали. Чего это она исключения не генерирует и пустые объекты не возвращает ? Хочу что бы было исключение и баста. И наплевать я хотел на тысячи ваших пользователей у которых после обновления сразу посыпятся все шаблоны. Пусть перед обновой сидят и переписывают все по правилам Герберта Шилдта !

Просто сказка начнется *HAHA*
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
Ну и отлично. Самоустранился. Мне это нисколько не мешает :-)

Вот разработчики такие сидели, репу чесали , думу думали, а как бы нам заюзать всю мощь C#, но вот более приближенно к конечному пользователю....
и пришла им классная идея, сделать свои функции , после которых не надо городить кучу проверок на всякие там нулевые объекты , выставлять кучу ловушек всяких исключений типа NullReferenceException
вот дорогой пользователь вызывай FindElementByXPath и делай простую проверку по любому параметру , мы уже создали и вернули тебе безопасный объект , все для твоего удобства . ну там куча восторженных последователей, куча продаж...
и в один прекрасный момент появляется .... ну даже незнаю какой эпитет тут применить... ну пусть будет Последователь Полного Руководства Герберта Шилдта , и так с порога претензию бросает , А я вот книжку прочитал умную и знаете ЧТО, а вы то неправильно свою функцию написали. Чего это она исключения не генерирует и пустые объекты не возвращает ? Хочу что бы было исключение и баста. И наплевать я хотел на тысячи ваших пользователей у которых после обновления сразу посыпятся все шаблоны. Пусть перед обновой сидят и переписывают все по правилам Герберта Шилдта !

Просто сказка начнется *HAHA*
:cc:для особо одаренных

Работа через HAP
Not-NullReferenceException2.png
 
Последнее редактирование:

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
  • Спасибо
Реакции: Маломальский
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
В этом сообщении описывали, почему работает именно так, как работает.
Вот так у меня отрабатывает по той логике, что я показал пример HAP

he == null:
HtmlElement he = null;
he = instance.ActiveTab.FindElementByXPath("//badtag", 0);

//if(he.ZP_ID == -1) // he.IsNull или крайним случаем string.IsNullOrEmpty(he.InnerText)
//{
//    return "Неверный путь xPath";
//}

return he.InnerText;
Если бы не RoyalBank, я бы и не догадался, отдельная благодарность!
Но все же тема в разделе Предложения, авось в будущем, что-то поменяется)) видно люди путаются.

Опять же, если посмотреть на это глазами компилятора, то, должно быть исключение NullReferenceException, сообщающее об "попытке использовать пустую ссылку, т.е. ссылку, которая не указывает ни на один из объектов".

То есть, без проверки на Null или Void, обязано сообщить: Ссылка на объект не указывает на экземпляр объекта.
 
Последнее редактирование:
  • Спасибо
Реакции: RoyalBank

vesb

Client
Регистрация
13.03.2010
Сообщения
139
Благодарностей
18
Баллы
18
Подскажите, прочитал ветку но так и не понял. Как мне тут сделать проверку, что не найден элемент.
Вот так не работает. Используется библиотека HtmlAgilityPack

C#:
string content = project.Variables["textReg"].Value;

//Создаем объект для результата Get запроса
HtmlDocument doc = new HtmlDocument();

//Загружем html в объект библиотеки
doc.LoadHtml(content);

HtmlNode elPage = doc.DocumentNode.SelectSingleNode("//div[contains(@itemprop, 'author')]");
if (elPage.OuterHtml != null) {
content = content.Replace(elPage.OuterHtml, "");
}

project.Variables["textReg"].Value = content;
выдает ошибку при отсутствии элемента:
Выполнение действия CSharp OwnCode. [Строка: 9; Cтолбец: 0] Ссылка на объект не указывает на экземпляр объекта.

( !he.IsVoid & !he.IsNull ) - не распознает. я так понимаю это не для HtmlAgilityPack
 
Последнее редактирование:

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93

vesb

Client
Регистрация
13.03.2010
Сообщения
139
Благодарностей
18
Баллы
18

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
я очень извиняюсь может за глупый вопрос, а это не проверка?
Это проверка после того, как была объявлена нода, if сможет отработать только в случае если HtmlNode не null.

Если тебе важно объявлять ноду, то объяви её пустой, и присваивай ей значение после проверки.

C#:
HtmlNode elPage;

if (doc.DocumentNode.SelectSingleNode("//div[contains(@itemprop, 'author')]") != null) 
    elPage = doc.DocumentNode.SelectSingleNode("//div[contains(@itemprop, 'author')]");
 
  • Спасибо
Реакции: vesb

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)