Bob (wahrscheinlich der x-te): Verständnisfrage zu XPath

Liebe Gemeinde,

ich hätte da eine Verständnisfrage zum Parsen von HTML-Code mittels XPath. Angenommen, ich hätte ich eine Struktur wie die folgende:

<div id="Text">  
Dies ist Satz 1.  
<p>Dies ist Satz 2.</p>  
Dies ist Satz 3.  
<div id="Box">Satz 4 gehört nicht zum Text.</div>  
</div>

Wie schaffe ich es dann KORREKTERWEISE,  die Sätze 1 und 3 als auch Satz 2 zu erfassen, aber bspw. nicht Satz 4. In der Praxis scheint zwar

//div[@id="Text"]/p

für alle drei Sätze zu funktionieren. Aber sollte es das auch? Bzw. wie käme ich nur an die Sätze 1 und 3 heran? Ich hätte jetzt Folgendes gesagt, aber das funktioniert nicht (liefert überhaupt nichts zurück):

//div[@id="Text"]/text()

Danke!

Bob

  1. Hallo Bob,

    Bzw. wie käme ich nur an die Sätze 1 und 3 heran?

    Satz 1: div[@id='Text']/text()[1]
    Satz 2: div[@id='Text']/p/text()
    Satz 3: div[@id='Text']/text()[3]

    Grüße,
    Thomas

    1. [Nachtrag:]

      Satz 1: div[@id='Text']/text()[1]
      Satz 2: div[@id='Text']/p/text()
      Satz 3: div[@id='Text']/text()[3]

      ^
                                        2

      Letzterer Textknoten ist der zweite direkte unterhalb von diesem div-Element.

      Grüße,
      Thomas

      1. Verständnisfrage zu XPath

        Bob (wahrscheinlich der x-te Bob in diesem Forum)

        Hallo Thomas,

        aber wieso funktioniert text() für sich allein nicht? Das Problem ist, dass ich nicht weiß, wie viele Sätze dort stehen. Ich bräuchte also eine allgemein gültige Schreibweise.

        Vielen Dank für deine Mühe!

        Bob

        1. Hallo,

          Hallo Thomas,

          aber wieso funktioniert text() für sich allein nicht? Das Problem ist, dass ich nicht weiß, wie viele Sätze dort stehen. Ich bräuchte also eine allgemein gültige Schreibweise.

          Die Sätze sind egal würde ich sagen. Die Anzahl der Knoten hingegen nicht. Da Du eine Mischung aus Textknoten und Elementknoten hast, wird es schwieriger.

          Gruß

          jobo

        2. Hallo Bob,

          aber wieso funktioniert text() für sich allein nicht? Das Problem ist, dass ich nicht weiß, wie viele Sätze dort stehen. Ich bräuchte also eine allgemein gültige Schreibweise.

          text() funktioniert in dieser Form div[@id='Text']//text() durchaus. Es wird die Sequenz der Textknoten zurück gegeben (inkl. dem letzen im Kind-div).

          Allein stehend ist text() nur die Kurzform von text()[1].

          Grüße,
          Thomas