2014-11-01 88 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元素