2016-12-23 117 views
1

我有一個帶有名稱空間的XML文件,我想用添加更多項目來更新此文件。使用名稱空間前綴更新XML文件

這裏我的XML文件的結構:

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns="http://feeds.omgeu.com/ns/1.0/" xmlns:omg="http://feeds.omgeu.com/ns/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<channel> 
    <item> 
     <omg:merchantrank>1</omg:merchantrank> 
     <omg:pid>RBK1444C</omg:pid> 
    </item> 
</channel> 
</rss> 

這裏我的功能添加項目:

protected function writeFeedAppend($data,$url) 
    { 
     set_time_limit(6000); 
     $bucket = $url; 
     $doc = new \DOMDocument('1.0', 'utf-8'); 
     $doc->formatOutput = true; 
     $doc->load($bucket); 
     $fragment = $doc->createDocumentFragment(); 
     $elementChild = ''; 
     foreach ($data as $feedData) 
     { 
      $elementChild .= '<item>'; 
      $elementChild .= '<omg:merchantrank>'; 
      $elementChild .= '1'; 
      $elementChild .= '</omg:merchantrank>'; 
      $elementChild .= '<omg:pid>'; 
      $elementChild .= $feedData['number']; 
      $elementChild .= '</omg:pid>'; 
      $elementChild .= '</item>'; 
      $elementChild .= "\n"; 
     } 
     $fragment->appendXML($elementChild); 
     $doc->documentElement->appendChild($fragment); 
     $doc->save($bucket);// Save as xml file 
    } 

有了這個功能,我得到了錯誤:警告:DOMDocumentFragment :: appendXML():命名錯誤:尚未定義商戶名稱空間前綴omg

我的問題是如何定義這個名稱空間,所以我可以繼續添加更多的項目到我的XML文件?

希望你們能幫助我。謝謝

+1

https://bugs.php.net/bug.php?id=44773 –

+0

要添加到現有的答案,你應該只是使用DOM函數來創建元素,而不是生成字符串和硬插入它們。 – Evert

回答

0

片段的頂級節點需要定義前綴。前綴只對該元素節點及其後代/屬性有效,直到在其他後代元素節點上重新定義爲止。

... 
$elementChild .= '<item xmlns:omg="http://feeds.omgeu.com/ns/1.0/">'; 
... 

但你不應該創建XML文本,使用DOM文檔的方法來創建節點,並把它們添加到父。

... 
$xmlns_omg = 'http://feeds.omgeu.com/ns/1.0/'; 
foreach ($data as $feedData) { 
    $item = $doc->documentElement->appendChild($doc->createElement('item')); 
    $item 
    ->appendChild($doc->createElementNS($xmlns_omg, 'omg:merchantrank')) 
    ->appendChild($doc->createTextNode('1')); 
    $item 
    ->appendChild($doc->createElementNS($xmlns_omg, 'omg:pid')) 
    ->appendChild($doc->createTextNode($feedData['number'])); 
} 
... 

DOMDocument::createElementNS()會在給定的命名空間的元素節點。它根據需要添加名稱空間定義。

是的,您可以在同一文檔中爲不同的名稱空間使用相同的前綴,或者爲相同的名稱空間使用不同的前綴。