Как обновить этот XML-файл с помощью PHP XML Reader & Writer?

У меня есть следующий XML-карта сайта, который содержит список URL-адресов, которые должны быть отправлены для поисковых систем. Я взял этот пример кода из другого ответа SO.

// Init XMLWriter
$writer = new XMLWriter();
$writer->openURI(APPLICATION_PATH . '/sitemap.xml');

// document head
$writer->startDocument('1.0', 'UTF-8');
$writer->setIndent(4);
$writer->startElement('urlset');
$writer->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');

// Write something
// this will write: <url><loc>some url here;  SO not allowed me</loc></url>
$writer->startElement('url');
$writer->writeElement('loc', 'some url here; SO not allowed me');
$writer->endElement();

// end urlset
$writer->endElement();
// end document
$writer->endDocument();

Этот код создает новую карту сайта с помощью средства записи XML. Я хочу добавить новый URL-адрес к существующему набору URL-адресов с помощью XMLReader

$reader = new XMLReader();
if (!$reader->open('sitemap.xml')){
    die("Failed to open 'sitemap.xml'");
}
while($reader->read()){
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'urlset') {
        $writer->startDocument('1.0', 'UTF-8');
        $writer->startElement('url');
        $writer->writeElement('loc', 'http://www.test.com');
        $writer->endElement();
        break;
    }
}
$reader->close();

Я не смог найти подходящие примеры того, как обновить XML-файл с помощью XMLreader. Как я могу переписать этот код, чтобы он добавлял новые URL-адреса к тегу набора URL-адресов с помощью XMLreader?

Редактировать 1:

У меня есть эта карта сайта xml,

<?xml version="1.0" encoding="UTF-8"?>
<urls>
    <url>
     <loc>http://www.bbc.com</loc>
    </url>
</urls>

Я хочу, чтобы программа добавила один новый URL-адрес в тег urls, например, так. добавление URL google.com,

<?xml version="1.0" encoding="UTF-8"?>
<urls>
    <url>
     <loc>http://www.bbc.com</loc>
    </url>
    <url>
     <loc>http://www.google.com</loc>
    </url>
</urls>

Как я могу получить эту функциональность или есть другие помощники, такие как DOMDocument или simplexml, чтобы сделать это в PHP? Любые ссылки на другие сайты также приветствуются.


person webblover    schedule 01.11.2014    source источник
comment
Мне нужно открыть sitemap.xml с помощью XMLReader, создать новый список URL-адресов и добавить к существующему набору URL-адресов, затем сохранить XML-файл и закрыть соединение.   -  person webblover    schedule 01.11.2014
comment
Вы можете отредактировать свой вопрос, чтобы уточнить биты.   -  person Flexo    schedule 02.11.2014
comment
Возможно, но вы просто продолжаете публиковать комментарии вместо того, чтобы вносить правки.   -  person Flexo    schedule 02.11.2014


Ответы (2)


XMLWriter не подходит для этой методологии. Вы должны использовать другую библиотеку, например, simplexml.

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

//load the file for our manipulating
$xml = simplexml_load_file($file);

//grab the parent element that we want to append to
$urls = $xml->urls;

//add a new child called Url
$newUrl = $urls->addChild('url');

//add a new child called loc to the new child Url we just created, add a link to yahoo
$newUrl->addChild('loc', 'http://www.yahoo.com');

//write the output
$xml->asXML($xml);

Вот пример eval.in

person Ohgodwhy    schedule 01.11.2014
comment
Спасибо, хороший ответ. Но я только сегодня услышал, что simpleXML загружает полный XML-файл в память и снижает эффективность. учтите, что в случае, если файл XML содержит 40 000 URL-адресов, он должен загрузить все в память перед обновлением XML. Как вы думаете? - person webblover; 01.11.2014
comment
@webblover Да... это правда. Я найду другой подход, учитывая эти обстоятельства. Дай мне пару минут. :) - person Ohgodwhy; 01.11.2014

Я жду хорошего ответа, у меня есть проблема (файл xml с более чем 50 000 элементов), и я хотел бы добавить элемент без загрузки полного xml в память

person JFouad    schedule 16.11.2014