我在使用PHP更改XML节点值方面遇到了一些困难。
我的XML是以下
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ProcessTransaction
xmlns="http://example.com">
<TransactionRequest
xmlns="http://example.com">
<Header>
<RequestType>SALE</RequestType>
<RequestMethod>SYNCHRONOUS</RequestMethod>
<MerchantInfo>
<PosName>kwstasna</PosName>
<PosID>1234</PosID>
</MerchantInfo>
</Header>
</TransactionRequest>
</ProcessTransaction>
</soap:Body>
</soap:Envelope>
我想要更改PosName
和PosID
。
从POST请求接收XML。
如果我print_r($REQUEST['xml']
我在文本中得到了值。
我所尝试的是以下
$posid = '321';
$posname = 'nakwsta';
$result = $xml->xpath("/soap:Envelope/soap:Body/ProcessTransaction/TransactionRequest/Header/MerchantInfo");
$result[0]->PosID = $posid;
$result[0]->PosName = $posname;
echo $result;
但我得到一个空数组Array[]
我认为我的错误在于<soap:Envelope
的值。
任何有相同问题并找到解决方法的人?
非常感谢你的时间。
答案 0 :(得分:4)
console.log(test.reduce((a, b) => (a.Shift + a.Shift1) > (b.Shift + b.Shift1) ? a : b));
元素(及其所有子节点)位于&#34; http://example.com&#34; 命名空间中。如果要使用{Shift: 2, Shift1: 211}
访问它们,则需要注册名称空间前缀:
ProcessTransaction
然后,您可以在查询的所有相关部分使用xpath()
前缀
$xml->registerXPathNamespace('ex', 'http://example.com');
其余代码应该正常运行,请参阅https://eval.in/916856
答案 1 :(得分:2)
考虑参数化的XSLT(与参数化SQL不同),其中PHP使用setParameter()将值传递给底层脚本。
作为信息,XSLT(兄弟到XPath)是一种专门用于转换XML文件的语言。 PHP可以使用XSL类运行XSLT 1.0脚本。具体来说,下面运行Identity Transform按原样复制XML,然后重写 PosName 和 PosID 节点。默认命名空间在与 doc 前缀对齐的顶部根标记中相应处理。
XSLT (另存为.xsl文件,格式正确的.xml文件)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://example.com">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:param name="PosNameParam"/>
<xsl:param name="PosIDParam"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- RE-WRITE PosName NODE -->
<xsl:template match="doc:PosName">
<xsl:copy>
<xsl:value-of select="$PosNameParam"/>
</xsl:copy>
</xsl:template>
<!-- RE-WRITE PosID NODE -->
<xsl:template match="doc:PosID">
<xsl:copy>
<xsl:value-of select="$PosIDParam"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强> PHP 强>
$posid = '321';
$posname = 'nakwsta';
// Load XML and XSL
$xml = new DOMDocument;
$xml->load('Input.xml');
$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');
// Configure transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// Assign values to XSLT parameters
$proc->setParameter('', 'PosNameParam', $posid);
$proc->setParameter('', 'PosIDParam', $posname);
// Transform XML source
$newXML = new DOMDocument;
$newXML = $proc->transformToXML($xml);
// Output to console
echo $newXML;
// Output to file
file_put_contents('Output.xml', $newXML);
<强>输出强>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ProcessTransaction xmlns="http://example.com">
<TransactionRequest>
<Header>
<RequestType>SALE</RequestType>
<RequestMethod>SYNCHRONOUS</RequestMethod>
<MerchantInfo>
<PosName>nakwsta</PosName>
<PosID>321</PosID>
</MerchantInfo>
</Header>
</TransactionRequest>
</ProcessTransaction>
</soap:Body>
</soap:Envelope>