Created
November 30, 2016 16:02
-
-
Save maxkoshevoi/2c552cf8e19a7c30029494df5f01e426 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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