navigate to section of XML with xpath

坚强是说给别人听的谎言 提交于 2019-12-12 03:08:27

问题


i am not able to see where i am going wrong with my xpath logic.

here is a section of a larger xml that i am working on transversing. (note im using the 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>

my goal is to extract various data points from these chunks of xml that i get out of the master XML file by using a

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

with this i am expecting to get all the sections outlined above so i can iterate them and extract things like website, phone, address...

problem is when i iterate this nodeset i cant get to the data points i want as if the node set is not the one outlined on top.

my logic is to extract a nodeset from the top most div into the nodset and when iterating them to xpath into the data points i want.

i do it like this:

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;
                     }
                }

i suspect my xpaths dont mesh together to get what i want but when i validate my expression i get the desired results... i used this to validate my thinking and it works leaving me at wits end:

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

回答1:


Your code is almost right, you just need to modify your xpath a bit.

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;
  }
}

The .// tells xpath to match from the current node and not from the root.



来源:https://stackoverflow.com/questions/9958730/navigate-to-section-of-xml-with-xpath

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!