替换xml远程文件中的值并保存

时间:2015-07-06 15:06:50

标签: php xml replace find preg-replace

我有一个远程xml文件:http://my-site/my-file.xml 此文件具有以下值:

<files>

  <file>
     <unique>444444</unique>
  </file>
  <file>
     <unique>666666</unique>
  </file>
  <file>
     <unique>888888</unique>
  </file>

</files>

我需要使用php将<unique>xxxxxx</unique>的值替换为其值的一半,以便将文件更改为

<files>

  <file>
     <unique>222222</unique>
  </file>
  <file>
     <unique>333333</unique>
  </file>
  <file>
     <unique>444444</unique>
  </file>

</files>

我有部分功能可以打开并保存文件,但不是查找和替换代码:

$xml_external_path = 'http://my-site/my-file.xml'; // THIS LINE MUST EXIST
$xml = simplexml_load_file($xml_external_path);// THIS LINE MUST EXIST

$searches = array();
$replacements = array();
foreach (....) {
    $searches[] = ....
    $replacements[] = ....
}
$newXml = simplexml_load_string( str_replace( $searches, $replacements, $xml->asXml() ) );

$newXml->asXml('new-xml.xml');// THIS LINE MUST EXIST

3 个答案:

答案 0 :(得分:1)

你可以使用preg_replace_callback作为模式:

$txt = <<<XML
<?xml version='1.0'?>
<files>
  <file>
     <unique>444444</unique>
  </file>
  <file>
     <unique>666666</unique>
  </file>
  <file>
     <unique>888888</unique>
  </file>
</files>
XML;
// load the xml like a text
$xml_external_path = 'http://my-site/my-file.xml;'; 
$txt = file_get_contents($xml_external_path);

$pattern = '/<unique>(.*?)<\/unique>/';
$response = preg_replace_callback($pattern,function($match){
    $value = intval(trim($match[1]))/2;
    return '<unique>'.$value.'</unique>';
},$xml);

$newXml = simplexml_load_string( $response );//
$newXml->asXml('new-xml.xml');//create the xml

//print_r($newXml);

答案 1 :(得分:0)

<?
$str = '<files>    
  <file>
     <unique>444444</unique>
  </file>
  <file>
     <unique>666666</unique>
  </file>
  <file>
     <unique>888888</unique>
  </file>
</files>';

$xml = simplexml_load_string($str);
$set = $xml->xpath('//unique');
foreach ($set as &$item)
  $item[0] = $item/2;

echo $xml->asXml();

结果

<?xml version="1.0"?>
<files>
  <file>
     <unique>222222</unique>
  </file>
  <file>
     <unique>333333</unique>
  </file>
  <file>
     <unique>444444</unique>
  </file>
</files>

答案 2 :(得分:0)

使用xslt的方法:

define('XML_PATH', 'http://my-site/my-file.xml'); 
define('XSL_PATH', 'divide.xsl');

$xml = new DOMDocument;
$xml->load(XML_PATH);

$xsl = new DOMDocument;
$xsl->load(XSL_PATH);

$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

echo $proc->transformToXML($xml);

其中divide.xsl是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="unique">
    <xsl:value-of select=". div 2"/>
  </xsl:template>
</xsl:stylesheet>