Правильный xPath

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Есть таблица с характеристиками
Данным кодом
Код:
IZennoList ItemList = project.Lists["ItemID"];
Tab tab = instance.ActiveTab;
HtmlElementCollection specCollection = tab.FindElementsByXPath("//table[@class='basic-table']");
foreach (HtmlElement spec in specCollection)

{
        HtmlElement specName = spec.FindChildByXPath("//tr/th", 0);
        HtmlElement specValue = spec.FindChildByXPath("//tr/td", 0);
        string specLog = string.Format("{0}:{1}",specName.InnerText, specValue.InnerText);
        project.SendInfoToLog(specLog, true);
        ItemList.Add(specLog);
}
пытаюсь собрать все характеристики в список
Но в список кладется только первое сочетание (Хват турника:Широкий)
Как изменить чтобы собирались все характеристики?
 

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
Как изменить чтобы собирались все характеристики?
У Вас в коллекцию попадает 1 элемент нужно выбрать все
C#:
IZennoList ItemList = project.Lists["ItemID"];
Tab tab = instance.ActiveTab;
HtmlElementCollection specCollection = tab.FindElementsByXPath("//*[@id='tab2']/table/tbody/tr");
foreach (HtmlElement spec in specCollection)
{
        string specName = spec.FindChildByXPath("th",0).GetAttribute("innertext");
        string specValue = spec.FindChildByXPath("td",0).GetAttribute("innertext");
        string specLog = string.Format("{0}:{1}",specName, specValue);
        project.SendInfoToLog(specLog, true);
        ItemList.Add(specLog);
}
 
  • Спасибо
Реакции: inotoxic

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
  • IZennoList ItemList = project.Lists["ItemID"];
  • Tab tab = instance.ActiveTab;
  • HtmlElementCollection specCollection = tab.FindElementsByXPath("//*[@id='tab2']/table/tbody/tr");
  • foreach (HtmlElement spec in specCollection)
  • {
  • string specName = spec.FindChildByXPath("th",0).GetAttribute("innertext");
  • string specValue = spec.FindChildByXPath("td",0).GetAttribute("innertext");
  • string specLog = string.Format("{0}:{1}",specName, specValue);
  • project.SendInfoToLog(specLog, true);
  • ItemList.Add(specLog);
  • }
Код собирает все элементы)
Спасибо
 

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Простите за наглость.
вот еще одна таблица

//div[@class='item_info_section']//dl - xpath к таблице характеристик, почему-то в коллекцию попадает только 1-ое значение
Ткните носом как собрать коллекцию
 

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
  • Спасибо
Реакции: inotoxic

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Все равно собирает одно значение

Полностью код блока, которым пытаюсь собрать характеристики

Код:
IZennoList ItemList = project.Lists["itemSpec"];
Tab tab = instance.ActiveTab;
HtmlElementCollection specCollection = tab.FindElementsByXPath("//dl/descendant-or-self::*");

foreach (HtmlElement spec in specCollection)
{
        string specName = spec.FindChildByXPath("./dt",0).GetAttribute("innertext").Trim(); //пробовал разные значение "//dt"|"/dt"|"dt"
        string specValue = spec.FindChildByXPath("./dd",0).GetAttribute("innertext").Trim();
    string specLog = string.Format("{0}¦{1}",specName, specValue);
        //project.SendInfoToLog(specLog, true);
        ItemList.Add(specLog);
}
и в чем разница //dl/descendant-or-self::*
от //div[@class='item_info_section']//dl
или //dl/* - разные виды конструкций собирают полный блок характеристик
 

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
и в чем разница //dl/descendant-or-self::*
от //div[@class='item_info_section']//dl
В данном случае при таком Xpath( //div[@class='item_info_section']//dl) в коллекции 1 элемент
при Xpath( //dl/descendant-or-self::*) в коллекции 19 элементов

C#:
IZennoList ItemList = project.Lists["itemSpec"];
Tab tab = instance.ActiveTab;
HtmlElement[] specCollection = tab.FindElementsByXPath("//dt|//dd").Elements;
string specName =String.Empty;
string specValue =String.Empty;
for (int i = 0; i < specCollection.Count(); i++)
{
 
    if(i%2==0)
    {
    specName = specCollection[i].InnerText;
    }else
    {
    specValue = specCollection[i].InnerText;
    string specLog = string.Format("{0}¦{1}",specName, specValue);
    project.SendInfoToLog(specLog , true);
    ItemList.Add(specLog); 
    }
}
 
  • Спасибо
Реакции: inotoxic

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
В данном случае при таком Xpath( //div[@class='item_info_section']//dl) в коллекции 1 элемент
при Xpath( //dl/descendant-or-self::*) в коллекции 19 элементов

C#:
IZennoList ItemList = project.Lists["itemSpec"];
Tab tab = instance.ActiveTab;
HtmlElement[] specCollection = tab.FindElementsByXPath("//dt|//dd").Elements;
string specName =String.Empty;
string specValue =String.Empty;
for (int i = 0; i < specCollection.Count(); i++)
{

    if(i%2==0)
    {
    specName = specCollection[i].InnerText;
    }else
    {
    specValue = specCollection[i].InnerText;
    string specLog = string.Format("{0}¦{1}",specName, specValue);
    project.SendInfoToLog(specLog , true);
    ItemList.Add(specLog);
    }
}
Aleksk код рабочий, второй раз выручаете.
Спасибо.
 

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