替换用simplexml_load_file()加载的xml中的文本?

时间:2015-03-17 13:11:29

标签: php xml simplexml

我有这个xml文件:

<flats>
    <flat>

        <images1>http://www.example.com/image1.jpg</images1>
        <images2>http://www.example.com/image1.jpg</images2>

    </flat>
</flats>

我需要使用php加载然后替换一些节点名称才能获得此功能(只需将 image1 image2 更改为图像:< / p>

<flats>
    <flat>

        <images>http://www.example.com/image1.jpg</images>
        <images>http://www.example.com/image1.jpg</images>

    </flat>
</flats>

我设法加载并保存文件,但我不知道如何替换节点名称。

$xml_external_path = 'http://external-site.com/original.xml';
$xml = simplexml_load_file($xml_external_path);

$xml->asXml('updated.xml');

更新 PHP

    $xml_external_path = 'http://external-site.com/original.xml';
    $xml = simplexml_load_file($xml_external_path);
    print_r($xml);
    $newXml = str_replace( 'images1', 'image',$xml ) ;
    print_r($newXml);

2 个答案:

答案 0 :(得分:0)

如果您只想重命名<images1><images2>代码,我建议您使用最简单的解决方案,即使用str_replace替换文字。

$xml_external_path = 'http://external-site.com/original.xml';
$xml = simplexml_load_file($xml_external_path);

$searches = ['<images1>', '<images2>', '</images1>', '</images2>'];
$replacements = ['<images>', '<images>', '</images>', '</images>'];

$newXml = simplexml_load_string( str_replace( $searches, $replacements, $xml->asXml() ) );
$newXml->asXml('updated.xml');

如果您需要更复杂的方式来处理任务,您可能需要查看DOMDocument class并构建您自己的新XML

答案 1 :(得分:0)

解析原始xml并创建一个新的xml:

$oldxml = simplexml_load_file("/path/to/file.xml");

// create a new XML trunk
$newxml = simplexml_load_string("<flats><flat/></flats>");

// iterate over child-nodes of <flat>
// check their name 
// if name contains "images", add a new child in $newxml

foreach ($oldxml->flat->children() as $key => $value) 
    if (substr($key, 0, 6) == "images") 
        $newxml->flat->addChild("images", $value);

// display new XML:

echo $newxml->asXML();

看到它有效:https://eval.in/301221

编辑:如果<flat>的所有孩子都是<imageX>,则无需核对$key

foreach ($oldxml->flat->children() as $value) 
    $newxml->flat->addChild("images", $value); 

编辑:以下是使用xpath更改的简短节点选择:

foreach ($oldxml->xpath("/flats/flat/*[starts-with(local-name(), 'images')]") as $value)
    $newxml->flat->addChild("images", $value);

上面的xpath语句将选择以“images”开头的所有<flat>子项,并将它们放在一个数组中。

看到它有效:https://eval.in/301233