2014-11-01 5 views
0

다음 검색 엔진을 위해 제출할 URL 목록이 포함 된 사이트 맵 XML이 있습니다. 다른 SO 응답에서이 예제 코드를 가져 왔습니다.이 XML 파일을 PHP XML reader & writer로 업데이트하는 방법은 무엇입니까?

// 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를 사용하여 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(); 

를 사용하여 기존의 urlset에 새로운 URL을 추가하고 싶습니다. XMLreader를 사용하여 URL 세트 태그에 새 URL을 추가하도록이 코드를 다시 작성하려면 어떻게해야합니까?

편집 1 : 나는이 XML 맵이

,

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

나는 프로그램이 예를 들어 같은 URL을 태그에서 하나 개의 새로운 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> 

가 어떻게이 기능을 얻을 수 또는 할 DOMDocument를 또는 SimpleXML을 같은 다른 헬퍼 PHP에서하는 것이 있는가? 다른 사이트에 대한 언급도 환영합니다.

+0

XMLReader를 사용하여 sitemap.xml을 열고 새 url 목록을 만들고 기존 urlset에 추가 한 다음 XML 파일을 저장하고 연결을 닫아야합니다. – webblover

+1

질문을 편집하여 비트를 명확하게 할 수 있습니다. – Flexo

+0

어쩌면 편집을하는 대신 의견을 계속 게시하는 것일 수도 있습니다. – Flexo

답변

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

+0

@webblover 네 .. 맞습니다. 나는 그러한 상황에서 다른 접근법을 찾을 것이다. 몇 분만 줘. :) – Ohgodwhy

1

나는 좋은 반응을 기다리고, 나는 50.000 위에 함께 몇 가지 문제 (XML 파일이 요소)를 추가하고 메모리에 전체 xml을로드하지 않고 요소를 추가하고 싶습니다.