2016-12-23 6 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() создает узел элемента в данном пространстве имен. При необходимости он добавляет определение пространства имен.

И да, вы можете использовать один и тот же префикс для разных пространств имен в одном документе или разные префиксы для одного и того же пространства имен.