Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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中正确附加xml子元素_Php_Xml - Fatal编程技术网

如何在php中正确附加xml子元素

如何在php中正确附加xml子元素,php,xml,Php,Xml,我试图迭代一系列电影名称,如下所示。我已经包括了实际输出和预期输出。谢谢 $root = new SimpleXMLElement('<movies/>'); $movies = ['foo', 'bar']; foreach($movies as $movie_name){ $movie_el = buildMovieTag($movie_name); $root->addChild($movie_el->asXML()); } function b

我试图迭代一系列电影名称,如下所示。我已经包括了实际输出和预期输出。谢谢

$root = new SimpleXMLElement('<movies/>');
$movies = ['foo', 'bar'];
foreach($movies as $movie_name){
    $movie_el = buildMovieTag($movie_name);
    $root->addChild($movie_el->asXML());
}


function buildMovieTag($name){
    $movie_tag = new SimpleXMLElement('<movie/>');
    $movie_tag->addChild('name', $name);
    return $movie_tag;
}
$root=新的SimpleXMLElement(“”);
$movies=['foo','bar'];
foreach($movies as$movie\u name){
$movie\u el=buildMovieTag($movie\u name);
$root->addChild($movie_el->asXML());
}
函数buildMovieTag($name){
$movie_tag=新的simplexmlement(“”);
$movie_tag->addChild('name',$name);
返回$movie_标签;
}
我期待着:

<?xml version="1.0"?>
<movies>
<movie><name>foo</name></movie>
<movie><name>bar</name></movie>
</movies>
<?xml version="1.0"?>
<movies><<?xml version="1.0"?>  // extra xml tag
<movie><name>foo</name></movie>
/><<?xml version="1.0"?> // extra xml tag
<movie><name>bar</name></movie>
/></movies>

福
酒吧
但我明白了:

<?xml version="1.0"?>
<movies>
<movie><name>foo</name></movie>
<movie><name>bar</name></movie>
</movies>
<?xml version="1.0"?>
<movies><<?xml version="1.0"?>  // extra xml tag
<movie><name>foo</name></movie>
/><<?xml version="1.0"?> // extra xml tag
<movie><name>bar</name></movie>
/></movies>

新的simplexmlement然后
asXML()
就是问题所在

addChild足以生成元素,然后其返回值为节点,然后节点上的后续addChild生成子元素

<?php
$root = new SimpleXMLElement('<movies/>');
$movies = ['foo', 'bar'];
foreach($movies as $movie_name) {
    $movie = $root->addChild('movie');
    buildMovieTag($movie, $movie_name);
}

function buildMovieTag($node, $name) {
    $node->addChild('name', $name);
}

echo $root->saveXML();
addChild('movie');
buildMovieTag($movie,$movie\u name);
}
函数buildMovieTag($node,$name){
$node->addChild('name',$name);
}
echo$root->saveXML();

福巴

编辑:如果您的数据更广泛,请将其结构化,使其成为标准的键/值数组,然后在项目上循环。原始问题的实际问题记录在答案的第一行

<?php
$root = new SimpleXMLElement('<movies/>');
$movies = [
    ['name'=>'foo', 'released' => '2020-12-01 00:00:00', 'plot' => 'foo is a foofoo'],
    ['name'=>'bar', 'released' => '2020-12-02 00:00:00', 'plot' => 'bar is a barbar'],
];
foreach ($movies as $movie) {
    buildMovieTag($root->addChild('movie'), $movie);
}

function buildMovieTag($node, $data) {
    foreach ($data as $key => $item) {
        // just year from datetime string
        if ($key === 'released') $item = date_create($item)->format('Y');
    
        $node->addChild($key, $item);
    }
}

echo $root->saveXML();
'foo','released'=>'2020-12-01 00:00:00','plot'=>'foo是一个foo'],
['name'=>'bar','released'=>'2020-12-02 00:00:00','plot'=>'bar是一个barbar'],
];
foreach($movies作为$movie){
buildMovieTag($root->addChild('movie'),$movie);
}
函数buildMovieTag($node,$data){
foreach($key=>$item形式的数据){
//距离日期时间字符串仅一年
如果($key=='released')$item=date\u create($item)->格式('Y');
$node->addChild($key,$item);
}
}
echo$root->saveXML();
结果(手动格式)


福
2020
福是一个福
酒吧
2020
酒吧是个野蛮人

谢谢。我想我可能对我的例子限制太多了。我希望我能够让
buildMovieTag
也添加其他类似的子元素:
foo2020foobar2019bar
请参见编辑,或者如果您只有名称,那么在buildMovieTag中您需要提取数据