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

时间:2016-12-23 04:38:42

标签: php xml namespaces 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():名称空间错误:未定义商家的名称空间前缀omg

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

希望你们能帮助我。感谢

1 个答案:

答案 0 :(得分:0)

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

AjaxAuthorizationAttribute

但是你不应该将XML创建为文本,使用DOM文档方法来创建节点并将它们附加到父节点。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class BasicHttpAuthorizeAttribute : AuthorizeAttribute
{
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class AjaxAuthorizationAttribute : BasicHttpAuthorizeAttribute
{
}

[BasicHttpAuthorize]
public class BaseController : Controller
{
}

public class MyController : BaseController
{
    [BasicHttpAuthorize(/* other properties */)]
    public ActionResult SomeAction()
    {
    }

    [AjaxAuthorization]
    public ActionResult SomeOtherAction()
    {
    }
}

... $elementChild .= '<item xmlns:omg="http://feeds.omgeu.com/ns/1.0/">'; ... 在给定的命名空间中创建一个元素节点。如果需要,它会添加命名空间定义。

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