Как выборочно удалить узлы в поддереве документа DOM? - PullRequest
1 голос
/ 09 августа 2011

Я использую DOMDocument для анализа html-документа и извлечения из него некоторых данных.Ниже приведена структура поддерева DOM

<div id="tab1">
    <div class="some class name"></div>
    <div class="some other class name">arbitrary data and nodes</div>
    <p> lot of paragraphs to follow </p>
    <p> paragraphs </p>
    <p> paragraphs </p>
    <p> paragraphs </p>
    <p> paragraphs </p>
    <br />
    <br />
    <br />
    <br />
    <br />
    <table />
    <table />
    <table />
    <table />
</div>

. Я не хочу первых двух дочерних элементов tab1.Я использую следующий код PHP

<?php 
$urlArray = file('sitemap.txt');
$dataSet = array();
foreach($urlArray as $url){
    $scrapedData = file_get_contents('./scraped-site/'.trim($url));
    $doc = new DOMDocument();
    @$doc->loadHTML($scrapedData);
    $domXpathDoc = new DOMXPath($doc);
    $results = '';
    $xpathArray = array(
        'info'=>'//*[@id="tabs1"]',
    );
    $set = array();
    foreach($xpathArray as $field => $xpath){
        $domNodeList = $domXpathDoc->query($xpath);
        foreach($domNodeList as $node){
            foreach ($node->childNodes as $child) {
                $set[] = $child->ownerDocument->saveXML( $child );
            }
        }
    }
    $dataSet[] = $set;
}

Приведенный код дает мне всем детям, как я могу выборочно избегать любого узла?

1 Ответ

1 голос
/ 09 августа 2011

[EDIT2: я попробовал ответ ниже (я узнал :)).Это работает для меня:

"//*[@id='tabs1'][name() != 'div']"

По сути, он говорит xpath игнорировать все элементы с именем 'div'.Вы можете игнорировать более одного элемента, подобного этому:

"//*[@id='tabs1'][name() != 'div' and name() != 'foo']"

Отображение элементов только после первых двух будет работать так:

"//*[@id='tabs1'][position()>2]"
...