Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > XML и регистр тэгов


Автор: HappyLife 19.1.2012, 16:30
Доброго времени суток уважаемые!

Совсем недавно реализовал хороший парсер XML документа с помощью SimpleXML.
Все однотипные XML файлы обрабатывались как часы. Но клиент, сказал, что у него есть такого же формата XML файлы, но с верхним регистром тэгов и аттрибутов. И я уже голову сломал, как мне сделать парсерсинг этого файла не делая второй парсер, потому что формат тот же... но регистр другой!

Автор: newbee 19.1.2012, 16:51
Если я не ошибаюсь, по стандарту XML регистр имен тегов и атрибутов должен быть нижним, так что клиент подсунул тебе что-то похожее на XML.

а) А почему нельзя изменить свой хороший парсер так, чтобы он съедал теги в верхнем регистре?
б) Если в хорошем парсере все прибито гвоздями, сделай/найди препроцессор, который преобразует файл из верхнего регистра в нижний.

Автор: HappyLife 19.1.2012, 19:53
a) В коде есть

Код

function parsing(SimpleXMLElement $offers)
{
   $offers->offer
}


Который придется заменять на

Код

function parsing(SimpleXMLElement $offers)
{
   $offers->OFFER
}


б) Менять нужно не весь файл, а только тэги!

1) Как вариант, можно попробовать регулярными выражениеми сделать замену тегов..
или 2) Сделать проверку каждого элемента, если нет в нижнем регистре то искать в верхнем....


Автор: newbee 19.1.2012, 19:56
Цитата(HappyLife @  19.1.2012,  20:53 Найти цитируемый пост)
Менять нужно не весь файл, а только тэги!
А я это и имела в виду - пройтись по xml-дереву и поправить его.

Цитата(HappyLife @  19.1.2012,  20:53 Найти цитируемый пост)
Сделать проверку каждого элемента, если нет в нижнем регистре то искать в верхнем....
А если тег в виде TagName? Правильно - приводить имя тега в верхний или нижний регистр, а там уже обрабатывать имена.

Автор: Sanchezzz 20.1.2012, 06:56
я отказался от SimpleXML  по 1 простой причине он не может парсить нестандартные xml и больших форматов у меня файл весил 50мб он загибался + некоторые атрибуты не выводил.

перешел на XMLReader

Код

/* костыль хочу массивы получать... */
 function xml2assoc($xml){ 
    $assoc = NULL; 
    $n = 0; 
    while($xml->read()){ 
        if($xml->nodeType == XMLReader::END_ELEMENT) break; 
        if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){ 
            $assoc[$n]['name'] = $xml->name; 
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value; 
            $assoc[$n]['val'] = xml2assoc($xml); 
            $n++; 
        } 
        else if($xml->isEmptyElement){ 
            $assoc[$n]['name'] = $xml->name; 
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value; 
            $assoc[$n]['val'] = ""; 
            $n++;                
        } 
        else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value; 
    } 
    return $assoc; 

    
    $reader = new XMLReader();
    $reader->open($file); //открыть файл 
    $reader->read();        // открыть секцию для чтения группа категорий
    $reader->read();        // открыть след секцию вложенную.  // категории
    
/* Категории */
    $category = $reader;
    $datacategory  = xml2assoc( $category );  //категории получить массив
        $reader->read(); //открыть группу секции товары 
        $otders = xml2assoc( $reader->read());  //получаем все товары

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)