Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP使用dom导入带有前缀的简单XML元素_Php_Xml - Fatal编程技术网

PHP使用dom导入带有前缀的简单XML元素

PHP使用dom导入带有前缀的简单XML元素,php,xml,Php,Xml,我试图让它接受以下XML: $loopc = 0; foreach( $xmls->url as $url ) { $num = $xmls->count(); if ( $loopc <= $num ) { insertNode($xmls, 'url['.$loopc.']', 'image:image', NULL); insertNode($xmls, 'url['.$loopc.']->image', 'image

我试图让它接受以下XML:

$loopc = 0;
foreach( $xmls->url as $url ) {
    $num = $xmls->count();
    if ( $loopc <= $num ) {
        insertNode($xmls, 'url['.$loopc.']', 'image:image', NULL);
        insertNode($xmls, 'url['.$loopc.']->image', 'image:loc', 'urldata');
        $loopc = $loopc+1;
    } else {
        break;
    }
}
echo $xmls->asXML();

function insertNode(SimpleXMLElement $xml, $path, $qname, $val) {
  eval('$cur = $xml->'.$path.';');
  $sd = dom_import_simplexml($cur);
  $newNode = $sd->ownerDocument->createElement($qname, $val);
  $newNode = $sd->appendChild($newNode);
  return simplexml_import_dom($newNode);
}
让它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.sitemaps.org/schemas/sitemap-image/1.1" xmlns:video="http://www.sitemaps.org/schemas/sitemap-video/1.1">
<url> 
    <loc>http://truefoodlooks.comcompare.php?id=49</loc>
</url>
</urlset>
但当我尝试执行第二个insertNode时,我会出现以下错误:

警告:dom_import_simplexml:第47行的/volume1/web/truefoodlooks/test/index.php中要导入的节点类型无效


如何解决此问题?

您不能将复杂的对象语法作为字符串传递。我对您的代码进行了一些修改以解决您的问题,但这不是一个很好的方法:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.sitemaps.org/schemas/sitemap-image/1.1" xmlns:video="http://www.sitemaps.org/schemas/sitemap-video/1.1">
<url> 
    <loc>http://truefoodlooks.comcompare.php?id=49</loc>
    <image:image>
        <image:loc>urldata</image:loc>
    </image:image>
</url>
</urlset>

为什么说这不是一个很好的方法呢?因为如果希望SimpleXml返回,就不需要将SimpleXml转换为dom。只需使用$simplexmlement->addChild'node','value'。另一件事是,如果您想以字符串形式传递对象语法,比如“obj->prop[0]”,您必须为此构建一个解析器。
        $loopc = 0;
    foreach( $xmls->url as $url ) {
        $num = $xmls->count();
        if ( $loopc <= $num ) {
           insertNode($xmls, 'url',$loopc,'image:image', NULL);
           insertNode($xmls->url[$loopc], 'image:image',NULL, 'image:loc', 'urldata');
            $loopc = $loopc+1;
        } else {
            break;
        }
    }
    echo $xmls->asXML();

    function insertNode(SimpleXMLElement $xml, $pathName, $pathIndex, $qname, $val) {

        if(!is_null($pathIndex))
        {
              $cur = $xml->{$pathName}[$pathIndex];
        }
        else{
              $cur = $xml->{$pathName};
        }
      $sd = dom_import_simplexml($cur);
      $newNode = $sd->ownerDocument->createElement($qname, $val);
      $newNode = $sd->appendChild($newNode);
      return simplexml_import_dom($newNode);
    }