PHP更改XML节点值

时间:2017-12-11 15:16:26

标签: php xml

我在使用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> 

我想要更改PosNamePosID。 从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的值。 任何有相同问题并找到解决方法的人?

非常感谢你的时间。

2 个答案:

答案 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>