перейти к разделу XML с помощью xpath - PullRequest
0 голосов
/ 31 марта 2012

Я не могу понять, где я ошибаюсь, используя мою логику xpath.

Здесь приведен фрагмент большего XML-файла, над которым я работаю над трансверсом.(обратите внимание, что я использую Html Agility Pack)

<div> 
    <div></div>
    <span class="pp-headline-item pp-headline-phone"> 
        <span class="telephone" dir="ltr"> 
            <nobr>(732) 562-1312</nobr> 
            <span class="pp-headline-phone-label" style="display:none">()</span>
        </span>&#8206;
    </span>  
    <span> &middot; </span> 
    <span class="pp-headline-item pp-headline-authority-page"> 
        <span>
            <a href="http://maps.google.com/local_url?q=http://www.fed.com/q=07746+pizza">
                <span>fed.com</span>
            </a>
        </span> 
    </span>  
</div>

Моя цель состоит в том, чтобы извлечь различные точки данных из этих фрагментов XML, которые я получаю из основного XML-файла, используя

.SelectNodes("//div/span['pp-headline-item pp-headline-phone']/../..")

с этим я ожидаю получить все разделы, описанные выше, так что я могу перебирать их и извлекать такие вещи, как веб-сайт, телефон, адрес ...

проблема в том, что когда я перебираю этот набор узлов, я не могу добраться до данныхточки, которые я хочу, как если бы набор узлов не был описан сверху.

Моя логика состоит в том, чтобы извлечь набор узлов из самого верхнего элемента div в набор узлов и при итерации их в xpath в нужные мне точки данных.

я делаю это так:

foreach (HtmlNode n in BuizRowsgoogMaps)
                {                    
                    //get phone number
                    if (n.SelectSingleNode("span/nobr").InnerHtml != null)
                    {
                        strPhone = n.SelectSingleNode("span/nobr").InnerHtml;

                        //get phone site
                        strSite = n.SelectSingleNode("//span['pp-headline-item pp-headline-authority-page']/span/a/span").InnerHtml;
                     }
                }

я подозреваю, что мои xpaths не мешаются вместе, чтобы получить то, что я хочу, но когда я проверяю свое выражение, я получаю желаемые результаты ... я использовал эточтобы подтвердить мое мышление, и это работает, оставляя меня в конце концов:

//div/span['pp-headline-item pp-headline-phone']/../../span['pp-headline-item pp-headline-phone']/span/nobr

1 Ответ

1 голос
/ 31 марта 2012

Ваш код почти верен, вам просто нужно немного изменить ваш xpath.

foreach (HtmlNode n in BuizRowsgoogMaps)
{
  //get phone number
  if (n.SelectSingleNode(".//span/nobr").InnerHtml != null)
  {
    strPhone = n.SelectSingleNode(".//span/nobr").InnerHtml;

    //get phone site
    strSite = n.SelectSingleNode(".//span['pp-headline-item pp-headline-authority-page']/span/a/span").InnerHtml;
  }
}

.// указывает xpath на совпадение с текущего узла, а не с корня.

...