4

DOMXPath::query を使用すると、1 レベルの深さの childNodes を取得できますか?

たとえば、次のようなドキュメントがあるとします。

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

NodeList には、引用ではなくスパンのみを含めたいと思います。

また、常に同じ要素 (div、spans など) であるとは限らないことにも言及する必要があります。あらゆるタイプの要素で動作する必要があります。

これは私が試したもので、うまくいかなかったようです:

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

2 に答える 2

3

使用する場合

/div/*

次に、この要素のすべての直接の子のリストを取得しますが、これらの子には子が含まれています。child の children は削除できないと思います

と呼ばれるデフォルトの軸が使用されていますchild::。この軸は、現在のノードの 1 レベル下の要素のみを返します

*すべての要素に一致しますが、属性や text() には一致しません

ノードへのパスを指定して注意する必要があります。これは、このツリー内のこの名前のすべてのノードを//node意味し、返すためです。descendant::node

于 2010-01-01T00:43:40.720 に答える
2

あなたの質問は少し具体的ではないので、解釈する方法はいくつかあります。現在の要素のすべての直接の子要素 ​​(およびそのすべてのサブ要素) が必要な場合は、次を使用します。

*/*

あなたの例では、これはあなたに与えます

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

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

すべての子ノードが必要な場合は、node()代わりに次を使用します*

*/node()

あなたの例では、これにより、上記の両方のサブ要素と、改行/インデントtext()ノードが提供されます。

ただし、子ノードのみを保持し、その子ノードは保持しない場合 (つまり、span要素のみを保持し、子要素を保持しない場合)、次の 2 つの式を使用する必要があります。

  1. を介して直接の子要素を選択します*/*
  2. これらの子要素を処理し、テキスト ノードのみを選択し、孫要素は選択しません。text()

私の PHP は少し錆びていますが、次のように動作するはずです。

$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
于 2010-01-01T14:52:25.150 に答える