使用命名空间前缀更新 XML 文件

Posted

技术标签:

【中文标题】使用命名空间前缀更新 XML 文件【英文标题】:Update an XML File With Namespace Prefix 【发布时间】:2016-12-23 04:38:41 【问题描述】:

我有一个带有命名空间的 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(): namespace error : Namespace prefix omg on Mercerrank is not defined

我的问题是如何定义这个命名空间,以便我可以继续向我的 xml 文件添加更多项目?

希望你们能帮助我。谢谢

【问题讨论】:

bugs.php.net/bug.php?id=44773 要添加到现有答案,您真的应该只使用 DOM 函数来创建元素,而不是生成字符串并硬插入它们。 【参考方案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() 在给定的命名空间中创建一个元素节点。如果需要,它会添加命名空间定义。

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

【讨论】:

以上是关于使用命名空间前缀更新 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误

JAXB:为啥在生成的 xml 文档中未使用定义的命名空间前缀?

Excel 到 XML 命名空间前缀自定义

如何在没有 xmlns="..." 的情况下使用 XML 命名空间前缀? (。网)

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间

XML 序列化和命名空间前缀