Skip to content

Instantly share code, notes, and snippets.

@maxkoshevoi
Created November 30, 2016 16:02
Show Gist options
  • Save maxkoshevoi/2c552cf8e19a7c30029494df5f01e426 to your computer and use it in GitHub Desktop.
Save maxkoshevoi/2c552cf8e19a7c30029494df5f01e426 to your computer and use it in GitHub Desktop.
public bool DoWork(HtmlDocument document)
{
//Сбрасываем предыдущие результаты
for (int i = 0; i < Pathways.Count; i++)
{
for (int j = 0; j < Pathways[i].elements.Count; j++)
{
SetNull(Pathways[i].elements[j]);
}
}
//Поиск контейнера
HtmlElement cont = null;
if (Container != null && Container.Tag != null && Container.Tag != "")
{
List<HtmlElement> tmp = GetElement(document, Container);
if (tmp != null)
{
cont = tmp[0];
}
else
{
SetErrorOrFalse(Container, Result.ErrorElementNotFound);
}
}
//Проходимся по всем путям
for (int p = 0; p < Pathways.Count; p++)
{
//Если исходные элемент пути - это контейнер, задаём GetElement
HtmlElement ge = null;
if (Pathways[p].isGetDataFromContainer)
{
if (cont == null)
{
for (int j = 0; j < Pathways[p].elements.Count; j++)
{
SetError(Pathways[p].elements[j], Result.ErrorContainerNotFound);
}
continue;
}
else
{
ge = cont;
}
}
// Эти переменные и цикл нужны для реализации EDistance.Any
bool anyActive = false, Success = false;
List<HtmlElement> anyList = new List<HtmlElement>();
int anyStart = 0;
int max = 1;
for (int any = anyActive ? 1 : 0; any < max; any++)
{
Success = true;
if (anyActive)
{
ge = anyList[any];
}
// Перебираем элементы
for (int el = anyActive ? anyStart : 0; el < Pathways[p].elements.Count; el++)
{
Element element = Pathways[p].elements[el];
if (element.Tag != null && (!anyActive || el != anyStart))
{
//Поиск нужного исходного элемента / проверка на его наличие
List<HtmlElement> tmp = GetElement(ge == null ? document.Body : ge, element);
if (tmp == null)
{
SetErrorOrFalse(element, Result.ErrorElementNotFound);
Success = false;
break;
}
ge = tmp[0];
//Активация EDistance.Any
if (element.WhichOne == EDistance.Any && tmp.Count > 1 && !anyActive)
{
anyActive = true;
anyStart = el;
anyList = tmp;
max = anyList.Count;
}
}
//Поиск нужных данных / Проверка на их наличие
for (int j = 0; j < element.Data.Count; j++)
{
Result result = GetData(ge, element.Data[j], DataType.Get);
element.Data[j].result = result;
}
}
if (anyActive)
{
if (Success)
{
break;
}
else
{
SetErrorOrFalse(Pathways[p].elements[anyStart], Result.ErrorElementNotFound);
for (int e = anyStart + 1; e < Pathways[p].elements.Count; e++)
{
SetNull(Pathways[p].elements[e]);
}
}
}
}
}
return true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment