XPath ChildNodes bir düzeyde almak

2 Cevap php

DOMXPath :: sorguyu kullanarak bu ChildNodes derin sadece bir düzeyi elde etmek mümkün mü?

Ben böyle bir belge olsaydı, örneğin:

<div>
    <span>
        <cite>
        </cite>
    </span>
    <span>
        <cite>
        </cite>
    </span>
</div>

Ben NodeList sadece yayılma değil değinir içeren isterim.

Ayrıca her zaman aynı elementler (divs, açıklıklı, vb) olmayacaktır bahsetmeliyiz. Bunun elemanının herhangi bir tür ile çalışmak gerekir.

Bu denedim ve o iş gibi görünmüyordu budur:

//*[not(ancestor::div)]

2 Cevap

Eğer kullanın

/div/*

o zaman bu öğenin tüm doğrudan çocukların bir listesini olsun ama bu çocukların çocuklarını içerir. Senin çocuğun çocuk silemezsiniz düşünüyorum

Orada, varsayılan ekseni kullanılan bu child:: denir. Bu eksen geçerli düğümü altında 1 düzeyinde sadece öğeleri döndürür

* tüm unsurları ile eşleşir ancak nitelikleri ne metin ne ()

Eğer düğüm yolunu belirtin ve descendant::node anlamına gelir çünkü //node konusunda dikkatli olması ve bu ağacın içinde bu isim bütün düğümleri döndürür

Sorunuzu biraz altında belirlenmiş, yani yorumlamak için çeşitli yollar vardır. Eğer (onların alt tüm öğeleri ile) geçerli öğenin tüm doğrudan alt öğeleri istiyorsanız, o zaman kullanın

*/*

Lütfen Örneğin, bu size verir

<span>
    <cite>
    </cite>
</span>

ve

<span>
    <cite>
    </cite>
</span>

Tüm çocuk istiyorsanız nodes, daha sonra kullanmak node() yerine *:

*/node()

Lütfen Örneğin, bu size verir both sub-elements as above, alongside with newline/indentation text() nodes.

If, however, you want to have only the child nodes ve not their children as well (i.e. only the span elements, but without their child elements), you must use two expressions:

  1. */* aracılığıyla doğrudan alt öğeleri seçmek
  2. process the those child elements ve select only the text nodes ve not the grvechildren elements via text()

Benim PHP biraz paslı, ama bu biraz gibi çalışması gerekir:

$doc = new DOMDocument;
// set up $doc
$xpath = new DOMXPath($doc);

// perform step #1
$childElements = $xpath->query('*/*');

$directChildren = array();
foreach ($childElements as $child) {
  // perform step #2
  $textChildren = $xpath->query('text()', $child);
  foreach ($textChildren as $text) {
    $directChildren[] = $text;
  }
}
// now, $directChildren contains all text nodes