HtmlAgilityPack 및 노드 및 하위 노드 선택

c# html-agility-pack xpath

문제

누군가가 나를 도울 수 있기를 바랍니다.

내가이 예제와 같은 여러 div를 포함하는 HTML 문서가 있다고 가정 해 봅시다 :

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

나는 HtmlAgilityPack을 사용하여 HTML 문서를 얻는다. 내가 알아야 할 것은 어떻게 각각의 "search_hit"-div에 걸쳐 범위를 얻을 수 있습니까?

내 첫 생각은 이런 식이었다.

foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
     foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("//span[@prop]"))
     {

     }
}

각 div는 속성으로 포함 된 범위가있는 객체 여야합니다. I. e.

public class Record
    {
        public string Name { get; set; }
        public string company { get; set; }
        public string street { get; set; }
    }

그리고이 목록은 다음 채워질 것입니다 :

public List<Record> Results = new List<Record>();

하지만 내가 사용하는 XPATH는 서브 노드에서 검색을 수행하지 않아야한다. 그것은 전체 문서를 반복해서 검색한다는 점에서 이음새가 없습니다.

나는 그것이 이미 전체 페이지의 범위를 얻는 그런 방식으로 작업하고 있다는 것을 의미합니다. 그러나 그때 나는 span과 div 사이의 관계가 없습니다. 의미 : 어떤 span이 어떤 div와 관련되는지 더 이상 알지 못합니다.

누군가 해결책을 알고 있습니까? 나는 벌써 그 정도로 놀았 어. 나는 지금 완전히 혼란스러워. :)

어떤 도움을 주셔서 감사합니다!

수락 된 답변

다음은 나를 위해 일한다. 중요한 비트는 BeniBela가 'SelectNodes'에 대한 두 번째 호출에서 점을 추가한다고 언급 한 것과 같습니다.

List<Record> lstRecords=new List<Record>();
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
  Record record=new Record();
  foreach (HtmlNode node2 in node.SelectNodes(".//span[@prop]"))
  {
    string attributeValue = node2.GetAttributeValue("prop", "");
    if (attributeValue == "name")
    {
      record.Name = node2.InnerText;
    }
    else if (attributeValue == "company")
    {
      record.company = node2.InnerText;
    }
    else if (attributeValue == "street")
    {
      record.street = node2.InnerText;
    }
  }
  lstRecords.Add(record);
}

인기 답변

// 를 사용하면 문서 시작에서 검색을 시작합니다.

.// 를 사용하여 현재 노드에서 모두 검색

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))

또는 접두사를 완전히 삭제하여 직접 자식을 검색합니다.

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("span[@prop]"))


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.