Обновите файл 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 на merchantrank не определен

Мой вопрос заключается в том, как определить это пространство имен, чтобы я мог продолжать добавлять другие элементы в мой XML-файл?

Надеюсь, вы, ребята, можете мне помочь. Спасибо

1

Решение

Узлы верхнего уровня фрагмента должны были бы определить префикс. Префиксы действительны только для этого узла элемента и его потомков / атрибутов, пока не будут переопределены на другом узле элемента-потомка.

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]