Как удалить элемент из файла XML после его анализа? - PullRequest
0 голосов
/ 02 августа 2010

Предположим, что файл XML:

<class name=math>
<student>luke1</student>
...
<student>luke8000000</student>
</class>
<class name=english>
<student>mary1</student>
...
<student>mary1000000</student>
</class>

после анализа class=math, я хочу удалить этот элемент из файла XML, чтобы при анализе class=english Twig не проходил черезсодержимое class=math.

Причина, по которой я хочу это сделать, заключается в том, что до сих пор, даже если я использую TwigRoots => {"class[\@name='english']" => \&counter}, мне все еще нужно долго ждать, пока Twig начнет анализировать class=english, потому что этонеобходимо пройти каждую строку class=math (поправьте меня, если нет необходимости проходить каждую строку).В самом файле, который я запускаю, есть несколько классов, я не хочу, чтобы Twig просматривал каждую строку в class=math перед тем, как найти класс, который ему действительно интересен.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 02 августа 2010

Не могли бы вы использовать опцию ignore_elts при сборке ветки:

ignore_elts
   This option lets you ignore elements when building the twig. This is useful
   in cases where you cannot use "twig_roots" to ignore elements, for example 
   if the element to ignore is a sibling of elements you are interested in.

           Example:

             my $twig= XML::Twig->new( ignore_elts => { elt => 1 });
             $twig->parsefile( 'doc.xml');

  This will build the complete twig for the document, except that all "elt" 
  elements (and their children) will be left out.

В этом случае вы можете написать XML :: Twig-> new (ignore_elts => { 'class[@name="math"]' => 1 }, ..., чтобы пропустить эти элементы

Обратите внимание, что эти элементы не будут включены в дерево, но они все равно будут проанализированы. Это немного ускоряет процесс, но не так сильно (как это для количественных данных?; -) В любом случае нужен весь файлдля анализа.

Кстати, XML в вашем вопросе не правильно сформирован, вокруг атрибутов должны быть кавычки.

0 голосов
/ 02 августа 2010

Я не использовал функцию удаления с TWIG, но проверьте эту ссылку Имеется некоторая информация об удалении узлов с использованием TWIG

Соответствующая часть здесь:

    }
    else {
        $para->delete;
    }
}

Последняя часть обработчика абзаца удаляет веточку из дерево результатов, если абзац не содержал совпадения для указанного ключевое слово. Это гарантирует, что только те абзацы, содержащие совпадение сделает это в окончательный вывод.

$para - это элемент, переданный в обработчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...