从SimpleXML xpath更改元素
我想在特定属性之后通过xpath搜索来更改元素值。
我有一个XML文件,我想在其中更改属性为“否”的所有Elements的值
<Value1>
<Type No="001">ABC</Type>
</Value1>
<Value2>
<Type No="002">CDE</Type>
<ID No="003">DEF</ID>
<ShareID No="004">GFH</ShareID>
</Value2>
...
...
在PHP中,我编写了一个脚本,该脚本应搜索所有属性为“ No”的元素,并应通过给定的Json Table更改值。在表格中,我具有ID和值对。
作为第一个原型,我刚刚编写了一个脚本,该脚本将First Element No ='001'更改为“ Test”;
<?php
$data = file_get_contents( "php://input" ); //$data is now the string '[1,2,3]';
$data = json_decode( $data ); //$data is now a php array array(1,2,3)
$test = $data->data;
// load the document
// Load XML File
$xml = simplexml_load_file($data->xmlFile);
//TODO Change each Element which is in the JSON Table
$result = $xml->xpath("//*[@No='001']");
// TODO Change every Element by corresponding JSON Table
$result[0] = "Test";
// save the updated document
$xml->asXML($data->xmlFile);
echo "OK";
?>
由于xpath函数,我收到以下数组:
SimpleXMLElement
@attributes:array(1)
0:"ABC"
我访问上述结果的方式不起作用。如何在xpath请求的结果中访问SimpleXMLElement中的元素值(“ ABC”)?我提供自己想要的发展
答案 0 :(得分:2)
请考虑XSLT(同XPath的兄弟),这是一种专用语言,旨在转换XML文件,尤其适合处理许多元素。实际上,您甚至可以将诸如'test'之类的参数从PHP传递到XSLT。 PHP可以使用其xsl类运行XSLT 1.0脚本,这可能需要在Web服务器重新启动时启用.ini文件中的php_xsl扩展名。
下面的示例演示了如何使用来自PHP的参数值,在@No='001'
条件下调整一个 Type 元素。您可以根据需要扩展参数和模板的数量。 Identity Transform会像调整之前一样复制整个文档。
XSLT (另存为.xsl文件,一个特殊的.xml文件)
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Initializing Parameters -->
<xsl:param name="php_param"/>
<!-- Identity Transform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Assign New Text Value by Parameter -->
<xsl:template match="Type[@No='001']">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:value-of select="$php_param"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
PHP
...
// LOAD XML
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load($data->xmlFile);
// LOAD XSLT
$xsl = new DOMDocument('1.0', 'UTF-8');
$xsl->load('XSLT_Script.xsl');
// INITIALIZE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// SET PARAMETER VALUE
$proc->setParameter('', 'php_param', 'test');
// TRANSFORM SOURCE
$newXML = $proc->transformToDoc($xml);
// SAVE TO FILE
file_put_contents($data->xmlFile, $newXML);