代码之家  ›  专栏  ›  技术社区  ›  karl

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

  •  1
  • karl  · 技术社区  · 8 年前

    我有一个名称空间为的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文件中添加更多项?

    希望你们能帮助我,谢谢

    1 回复  |  直到 8 年前
        1
  •  0
  •   ThW    8 年前

    片段的顶级节点需要定义前缀。前缀仅对该元素节点及其子体/属性有效,直到在另一子体元素节点上重新定义。

    ...
    $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() 在给定命名空间中创建元素节点。如果需要,它会添加名称空间定义。

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