2014-11-01 94 views
0

我有以下網站地圖XML,其中包含要提交給搜索引擎的URL列表。我從另一個SO答案中獲取了這個示例代碼。如何用PHP XML讀寫器更新這個xml文件?

// 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編寫器創建新的站點地圖。我想用的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(); 

我找不到有關如何使用的XmlReader更新XML文件正確的樣本,以新的URL附加到現有網址設定。我怎樣才能重寫這段代碼,以便使用XMLreader將新的URL追加到url set標籤中?

編輯1:

我有這樣的XML網站地圖,

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

我希望程序在網址標籤像這樣如增加一個新的URL。添加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> 

我怎麼能得到這個功能,或者是有一些其他傭工喜歡DOM文檔simplexml的做,在PHP?任何對其他網站的引用也是受歡迎的。

+0

我需要使用XMLReader打開sitemap.xml,創建新的url列表並追加到現有的urlset,然後保存XML文件並關閉連接。 – webblover 2014-11-01 18:08:24

+1

您可以編輯您的問題以澄清位。 – Flexo 2014-11-02 00:05:17

+0

也許,但你只是發表評論,而不是進行編輯。 – Flexo 2014-11-02 04:15:53

回答

1

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); 

Here's an eval.in example

+0

謝謝,很好的答案。但我今天剛聽說simpleXML會將完整的XML文件加載到內存中並降低效率。如果XML文件包含40,000個URL,請考慮在更新XML之前將所有內容加載到內存中。你怎麼看? – webblover 2014-11-01 18:23:44

+0

@ webblover是的......這是真的。鑑於這些情況,我會找到一種不同的方法。給我幾分鐘。 :) – Ohgodwhy 2014-11-01 18:42:54

1

我等待了良好的反響,我有超過50.000的一些問題(xml文件元素),我想在內存中添加無負載完整xml元素