2012-03-31 4 views
0

Ich bin nicht in der Lage zu sehen, wo ich falsch mit meiner Xpath-Logik bin.Navigieren zu XML-Abschnitt mit xpath

Hier ist ein Abschnitt eines größeren xml, dass ich an Transversieren arbeite. (Man beachte im das Html Agility Pack beiliegt)

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

mein Ziel ist es, verschiedene Datenpunkte aus diesen Stücken von XML zu extrahieren, die ich aus der Master-XML-Datei erhalten, indem ein

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

mit dieser Verwendung Ich erwarte, alle oben beschriebenen Abschnitte zu bekommen, damit ich sie iterieren kann und Dinge wie Website, Telefon, Adresse ...

Problem ist, wenn ich diesen Knotenpunkt iteriere, kann ich nicht zu den Datenpunkten, die ich will, als ob die Knotensatz ist nicht der oben skizzierte.

Meine Logik besteht darin, ein Knotenset aus dem obersten Div in das Nodset zu extrahieren und beim Iterieren zu Xpath in die Datenpunkte, die ich will.

Ich mache es wie folgt aus:

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 mein XPaths vermuten zusammen nicht Netz zu bekommen, was ich will, aber wenn ich meinen Ausdruck zu validieren erhalte ich die gewünschten Ergebnisse ... i verwendet, um dieses mein Denken zu validieren und es funktioniert verlassen mich am wits ende:

Antwort

1

Ihr Code ist fast richtig, Sie müssen nur Ihre Xpath etwas ändern.

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

Die .// sagt XPath von dem aktuellen Knoten entsprechen und nicht von der Wurzel.

Verwandte Themen