Вопрос по парсингу

Dareczek

Новичок
Здравствуйте. Хотелбы спросить где можно найти полезную инфу про парсинг. Уточню вопрос. Допустим есть *.xml файл, мне с его нужно вытянуть только ссылки. Главное узнать как бы можно его обработать как нибуть. Например все по ключу topic или как то так. Извините за нубство )
 

Dareczek

Новичок
Допустим есть такой кусочек кода:
PHP:
<ExternalPage about="http://www.awn.com/">
    <d:Title>Animation World Network</d:Title>
    <d:Description>Provides information resources to the international animation community. Features include searchable database archives, monthly magazine, web animation guide, the Animation Village, discussion forums and other useful resources.</d:Description>
    <priority>1</priority>
    <topic>Top/Arts/Animation</topic>
  </ExternalPage>
  <ExternalPage about="http://animation.about.com/">
    <d:Title>About.com: Animation Guide</d:Title>
    <d:Description>Keep up with developments in online animation for all skill levels. Download tools, and seek inspiration from online work.</d:Description>
    <topic>Top/Arts/Animation</topic>
  </ExternalPage>
Мне нужно получить все ссылки из ExternalPage. Я делал вот так:
PHP:
$xml = simplexml_load_file("data.xml");

for($i = 0; count($xml->ExternalPage) > $i; $i++)
{
	echo $xml->ExternalPage[$i]['about'];
	echo '<br/>';
}
Но, это очень долго времени занимает. У меня 7кб файл текста, почти 2мин обробатывал. Помогите сократить время.
 

hell0w0rd

Продвинутый новичок
Dareczek
Как минимум убрать вызов на каждый проход count
$size = count($xml->ExternalPage);
for($i = 0; $size > $i; $i++){}
Еще я не уверен, но мне кажется можно получить выборку XPath'ом и пройтись по ней, а не через цикл
 

Dareczek

Новичок
Dareczek
Как минимум убрать вызов на каждый проход count
$size = count($xml->ExternalPage);
for($i = 0; $size > $i; $i++){}
Еще я не уверен, но мне кажется можно получить выборку XPath'ом и пройтись по ней, а не через цикл
Спасибо за подсказку про счетчик. Реально он много времени жрет при этом. Спасибо. а про XPath побежал почитаю. Спс еще раз
 

Dareczek

Новичок
с использованием xpath нечего хорошего пока не сдела... Может можете помочь...
 

hell0w0rd

Продвинутый новичок
Я сам им никогда не пользовался, просто знаю что это выборка по xml-дереву.. Вроде для вашего случая это будет как-то так:
PHP:
$res = $xml->xpath('/ExternalPage/about/');
 

Dareczek

Новичок
Я сам им никогда не пользовался, просто знаю что это выборка по xml-дереву.. Вроде для вашего случая это будет как-то так:
PHP:
$res = $xml->xpath('/ExternalPage/about/');
Почитал еще более про это в справочнике, и то что вы выше написали должно работать, и еще как. Но у меня показывает пусотй массив. Т.е array(0) { } . Перепробовал разные пути, но все ровно массив пустой )). вот такой примерно xml
PHP:
<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns:r="http://www.w3.org/TR/RDF/" xmlns:d="http://purl.org/dc/elements/1.0/" xmlns="http://dmoz.org/rdf/">
  <Topic r:id="">
    <catid>1</catid>
  </Topic>
  <Topic r:id="Top/Arts">
    <catid>381773</catid>
  </Topic>
  <Topic r:id="Top/Arts/Animation">
    <catid>423945</catid>
    <link1 r:resource="http://www.awn.com/"></link1>
    <link r:resource="http://animation.about.com/"></link>
    <link r:resource="http://www.toonhound.com/"></link>
    <link r:resource="http://enculturation.gmu.edu/2_1/pisters.html"></link>
    <link r:resource="http://www.digitalmediafx.com/Features/animationhistory.html"></link>
    <link r:resource="http://www.spark-online.com/august00/media/romano.html"></link>
    <link r:resource="http://www.animated-divots.net/"></link>
  </Topic>
  <ExternalPage about="http://www.awn.com/">
    <d:Title>Animation World Network</d:Title>
    <d:Description>Provides information resources to the international animation community. Features include searchable database archives, monthly magazine, web animation guide, the Animation Village, discussion forums and other useful resources.</d:Description>
    <priority>1</priority>
    <topic>Top/Arts/Animation</topic>
  </ExternalPage>
Писал и
PHP:
$xml->xpath('/RDF/ExternalPage')
, но резултата нет. Может че не так делаю?
 

Dareczek

Новичок
Dareczek
Вы обрезаете ноды, я не могу загрузить вашу строчку. У вас на вход идет умный xml, его точно xpath будет разбирать быстрее, посмотрите 2 лекции с ШРИ по xml и xpath
http://events.yandex.ru/events/shri/msk-2012/talks/555/
http://events.yandex.ru/events/shri/msk-2012/talks/556/
Я здесь даю лишь пару строчек, так как селый xml файл занимет 2 гига)) там почти 15милиардов строк ). Нужно както сделать парсер, который вытянет ссылки. Уже какбы и сделал, но он грузит веками, и то незагружает так как некоторые функции не загружают 2ГБ файлов. А про 2 лекции с ШРИ по xml и xpath уже пошел смотреть. Спс за помощь.
 

hell0w0rd

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

WMix

герр M:)ller
Партнер клуба
если не ошибся, то так
PHP:
function startElemHandler($parser, $name, $attribs) {
    if (strcasecmp($name, "ExternalPage") == 0) {
        foreach($attribs as $key => $val){
            if (strcasecmp($key, "about") == 0) {
                echo $name. " ".$key." = ".$val;
            }
        }
    }
}
function endElemHandler($parser, $name) {}

// создаем парсер
$parser = xml_parser_create();
xml_set_element_handler($parser, startElemHandler, endElemHandler);

// читаем файл порциями и парсим
$fh = fopen($xml_file, "r");
while (!feof($fh)) {
    $data = fread($fh, 4096);
    xml_parse($parser, $data, feof($fh));
}
// для теста
//xml_parse($parser, '<xml>......</xml>');

xml_parser_free($parser);
 
Сверху