使用命名空间前缀更新 XML 文件
Update an XML File With Namespace Prefix
我有一个带有命名空间的 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():命名空间错误:未定义 merchantrank 上的命名空间前缀 omg
我的问题是如何定义这个命名空间,以便我可以继续向我的 xml 文件中添加更多项目?
希望大家能帮帮我。谢谢
片段的顶级节点需要定义前缀。前缀仅对该元素节点及其 descendants/attributes 有效,直到在另一个后代元素节点上重新定义。
...
$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()
在给定的命名空间中创建一个元素节点。如果需要,它会添加命名空间定义。
是的,您可以对同一文档中的不同名称空间使用相同的前缀,或者对同一名称空间使用不同的前缀。
我有一个带有命名空间的 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():命名空间错误:未定义 merchantrank 上的命名空间前缀 omg
我的问题是如何定义这个命名空间,以便我可以继续向我的 xml 文件中添加更多项目?
希望大家能帮帮我。谢谢
片段的顶级节点需要定义前缀。前缀仅对该元素节点及其 descendants/attributes 有效,直到在另一个后代元素节点上重新定义。
...
$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()
在给定的命名空间中创建一个元素节点。如果需要,它会添加命名空间定义。
是的,您可以对同一文档中的不同名称空间使用相同的前缀,或者对同一名称空间使用不同的前缀。