2017-12-19 5 views
2

In einem HTML unter:Warum funktioniert mein XPath nicht mit gemischten Inhalten?

<html> 
     <div class="row content-box"> 
     <div class="col-xs-12 col-sm-6"> 
     <div class="gray-separator-3"> 
     <div class="row to-top"> 
      <h2 class="xs-mt-0"> 
      Who's covered? 
      <span class="ns-i-pencil_icon icon-flipped pensil-font"></span> 
      <span> 
       <a class="edit-font firefinder-match" href="#">Edit</a> 
      </span> 
     </h2> 
     <p class="xs-mt-0 xs-mb-0">David</p> 
     </div> 
     </div> 
     </div> 
    </html> 

XPath für den Link 'Bearbeiten' nicht scheinen, wenn sie als geschrieben zu arbeiten:

//div[.//h2[contains(.,'Who's covered?')]]//span/a[.='Edit']

aber scheint wie erwartet zu funktionieren, wenn geschrieben wie:

//div[.//h2]//span/a[.='Edit'] 

Und funktioniert gut, wenn es keinen Kindknoten unter 012 gibt

Wie im Fall unten, wenn ich einen XPath wie folgt schreiben:

//div[.//h2[contains(.,'What's covered?')]]//span/a[.='Edit'] es identifiziert das Element.

<html> 
    <div class="row content-box"> 
    <div class="col-xs-12 col-sm-6"> 
    <div class="gray-separator-3"> 
    <div class="row to-top"> 
     <h2 class="xs-mt-0"> 
     What's covered? 
     </h2> 
     <span> 
     <a class="edit-font firefinder-match" href="#">Edit</a> 
     </span> 
     <p class="xs-mt-0 xs-mb-0">David</p> 
    </div> 
    </div> 
    </div> 
</html> 

Gibt es einen Grund, warum es nicht die <h2> liest die untergeordneten Knoten unter ihm hat zusammen mit dem Text?

Kann jemand erklären, was der Unterschied ist, wenn ein Knoten sowohl Text als auch einen Teilbaum hat und ein Knoten, der nur Text, aber keinen Teilbaum hat, wenn er einen XPath schreibt?

Antwort

3

Dies hat nichts mit gemischtem oder nicht gemischtem Inhalt zu tun.

Ihr erster XPath ist fehlerhaft. Ändern Sie es aus

//div[.//h2[contains(.,'Who's covered?')]]//span/a[.='Edit'] 

zu

//div[.//h2[contains(.,"Who's covered?")]]//span/a[.='Edit'] 

und es wird funktionieren wie erwartet.

Beachten Sie, dass, wenn die Sprache der XPath-Hosting bereits " wird unter Verwendung der XPath selbst zu umgeben, sollten Sie in der Lage sein, den inneren " als so zu entkommen (für Java):

"//div[.//h2[contains(.,\"Who's covered?\")]]//span/a[.='Edit']" 

und funktioniert gut Wenn unter

kein
vorhanden ist

Nein, dieser fehlerhafte XPath sollte nirgendwo gut funktionieren.

+0

Es funktioniert jedoch für wenige Fälle. Ich streite nicht über die Logik, aber hier ist ein Beispiel, wo es mit einfachen Anführungszeichen funktioniert. Aber so habe ich alle Objekt-IDs für immer geschrieben. http://i66.tinypic.com/2ryod3s.jpg –

+1

Entschuldigung, aber Sie müssten einen vollständigen ** [mcve] ** bereitstellen, um jeden davon zu überzeugen, dass ein fehlerhafter XPath "funktioniert". Sehen Sie es aus der XPath-Parserperspektive: Wenn Sie auf das '' 'nach' 'Who' 'stoßen, schließen Sie die zu erstellende Zeichenfolge als erstes Argument für 'contains()'; dann stößt du auf ein 's' und sagst:" uhh, das soll nicht hier sein. " – kjhughes

+1

Nun, das ist völlig sinnvoll, wenn es ein einfaches Zitat in den Anführungszeichen gibt. Vielen Dank. Und es hat funktioniert, als ich die einfachen Anführungszeichen in das Doppelte änderte. –