2016-12-23 61 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()会在给定的命名空间的元素节点。它根据需要添加名称空间定义。

是的,您可以在同一文档中为不同的名称空间使用相同的前缀,或者为相同的名称空间使用不同的前缀。