Я использую комбинацию XMLReader и simpleXML для анализа сообщений в файле экспорта WordPress. Я понимаю, что это немного не соответствует норме, но это больше для резервного проекта, поэтому мы можем легко подтянуть одну из этих статей, если нам это нужно в futre. Сайт WP, на котором они были, должен спуститься.
Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из узлов в файле XML пусты или содержат бесполезные значения (т. Е. Не полные сообщения). Мне нужно добавить некоторые условия длины строки, но я не уверен, как проверить их.
<?php $path_to_xml_file = 'compress.zlib://wordpress.2011.xml.gz'; $reader = new XMLReader(); $reader->open($path_to_xml_file); while($reader->read()) { if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item') { $doc = new DOMDocument('1.0', 'UTF-8'); $xml = simplexml_import_dom($doc->importNode($reader->expand(),true)); //echo $xml->title; //or whatever // Take care of the articles $newcontent = $xml->children('http://purl.org/rss/1.0/modules/content/'); $contentString = $newcontent->encoded; $titleString = $xml->title; echo ' <div class="article-container" id="article-' . $xml->title . '"> <a href="#top" class="top-link">Back to the Top</a> <h2>' . $xml->title . '</h2> <div class="articles">' . $newcontent->encoded . '</div> </div>'; } } ?>
Я смог успешно проверить это с помощью simpleXML, но это было слишком много из памяти. Это был мой код simplexml :
<?php $url = 'wordpress.2011.xml.gz'; $xml = new SimpleXMLElement("compress.zlib://$url", NULL, TRUE); foreach ($xml->item as $item) : $newcontent = $item->children('http://purl.org/rss/1.0/modules/content/'); ?> <?php $contentString = $newcontent->encoded; $titleString = $item->title; if ((strlen($contentString) < 13) || (strlen($titleString) < 5)) { echo ''; } else { echo ' <div class="article-container" id="article-' . $item->title . '"> <a href="#top" class="top-link">Back to the Top</a> <h2>' . $item->title . '</h2> <div class="articles">' . $newcontent->encoded . '</div> </div>'; } ?> <?php endforeach; ?>
ОБНОВИТЬ
С помощью Фрэнсиса он работает сейчас. Вот код:
<?php $path_to_xml_file = 'compress.zlib://wordpress.2011.xml.gz'; $reader = new XMLReader(); $reader->open($path_to_xml_file); $contentNS = 'http://purl.org/rss/1.0/modules/content/'; while($reader->read()) { if($reader->nodeType == XMLReader::ELEMENT and $reader->name == 'item') { $doc = new DOMDocument('1.0','UTF-8'); $xml = simplexml_import_dom($doc->importNode($reader->expand(), true)); $titleString = (string) $xml->title; $contentString = (string) $xml->children($contentNS)->encoded; if (strlen($contentString) > 12 and strlen($titleString) > 4) { // Be careful with your output escaping! // This below looks like it might be wrong: // - $titleString for an ID (use slug) // - $titleString not escaped // - $contentString should be escaped? not sure here. // Have you considered using XMLWriter()? echo ' <div class="article-container" id="article-' . $titleString . '"> <a href="#top" class="top-link">Back to the Top</a> <h2>' . $titleString . '</h2> <div class="articles">' . $contentString . '</div> </div>'; } else { echo''; } $reader->next(); //skip the subtrees, go to next item sibling // we already expand()ed this so we don't need to walk it. } } ?>