我有一个远程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
答案 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>