PHP更改XML节点值

PHP更改XML节点值,php,xml,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

我在使用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> 
但是我得到一个空数组
array[]


我认为我的错误在于
ProcessTransaction
元素(及其所有子节点)的值都在名称空间中。如果要使用
xpath()
访问它们,则需要注册名称空间前缀:

$xml->registerXPathNamespace('ex', 'http://example.com');
然后,您可以在查询的所有相关部分上使用
ex
前缀

$result = $xml->xpath("/soap:Envelope/soap:Body/ex:ProcessTransaction/ex:TransactionRequest/ex:Header/ex:MerchantInfo");

代码的其余部分应该正常工作,请参见
ProcessTransaction
元素(及其所有子节点)位于命名空间中。如果要使用
xpath()
访问它们,则需要注册名称空间前缀:

$xml->registerXPathNamespace('ex', 'http://example.com');
然后,您可以在查询的所有相关部分上使用
ex
前缀

$result = $xml->xpath("/soap:Envelope/soap:Body/ex:ProcessTransaction/ex:TransactionRequest/ex:Header/ex:MerchantInfo");

代码的其余部分应该能够正常工作,请参见

考虑一个参数化XSLT(与参数化SQL不同),其中PHP使用将值传递给底层脚本

作为信息,(与XPath同级)是一种专门用于转换XML文件的语言。PHP可以使用该类运行XSLT1.0脚本。具体来说,下面运行复制XML原样,然后重写PosName和PosID节点。默认名称空间在与文档前缀对齐的顶部根标记中相应地处理

XSLT(另存为.xsl文件,一种特殊的格式良好的.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>
                        <Header>
                              <RequestType>SALE</RequestType>
                              <RequestMethod>SYNCHRONOUS</RequestMethod>
                              <MerchantInfo>
                                    <PosName>nakwsta</PosName>
                                    <PosID>321</PosID>
                              </MerchantInfo>
                        </Header>
                  </TransactionRequest>
            </ProcessTransaction>
      </soap:Body>
</soap:Envelope>

出售
同步的
纳科斯塔
321

考虑一个参数化XSLT(与参数化SQL不同),PHP使用参数化XSLT将值传递给底层脚本

作为信息,(与XPath同级)是一种专门用于转换XML文件的语言。PHP可以使用该类运行XSLT1.0脚本。具体来说,下面运行复制XML原样,然后重写PosName和PosID节点。默认名称空间在与文档前缀对齐的顶部根标记中相应地处理

XSLT(另存为.xsl文件,一种特殊的格式良好的.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>
                        <Header>
                              <RequestType>SALE</RequestType>
                              <RequestMethod>SYNCHRONOUS</RequestMethod>
                              <MerchantInfo>
                                    <PosName>nakwsta</PosName>
                                    <PosID>321</PosID>
                              </MerchantInfo>
                        </Header>
                  </TransactionRequest>
            </ProcessTransaction>
      </soap:Body>
</soap:Envelope>

出售
同步的
纳科斯塔
321


您必须将名称空间注册到$xml中,才能在存在3个名称空间的第一部分找到正确的路径()@Edwin我该怎么办?您需要注册
xmlns=”http://example.com“
,因为这是您尝试使用的节点(请参阅手册中的第一个示例),您希望得到什么结果?转换的XML或刚刚解析的XPath值?@Edwin与右下方的答案相同?您必须将名称空间注册到$XML,才能获得正确的路径()@Edwin在存在3个名称空间的第一部分,我应该怎么做?您需要注册
xmlns=”http://example.com“
,因为这是您尝试使用的节点(请参阅手册中的第一个示例),所以您希望得到什么结果?转换后的XML或刚刚解析的XPath值?@Edwin这与右下角的答案相同?答案很好,您的示例是正确的,但有没有办法将其转换回XML?您应该能够调用
$XML->asXML()
,我将用一个新的示例更新100%正确。我对名称空间一无所知。第一次获取XML!非常感谢你!答案很好,您的示例是正确的,但是有没有办法将其转换回xml?您应该能够调用
$xml->asXML()
,我将用一个新的示例进行更新100%正确。我对名称空间一无所知。第一次获取XML!非常感谢你!这看起来不错,但这样做有什么好处?(谢谢)现在看来你做了一些小的改变,这似乎有些过头了。但是,如果您必须进行实质性的转换,如新节点、扁平化子节点、转换为csv/txt,XSLT是一个很好的工具,因为您可以避免许多
foreach
循环和
if
逻辑。除此之外,我最近还发现了在PHP和Python中传递参数的方法,我只是想从你的问题中得到乐趣!这看起来不错,但这样做有什么好处?(谢谢)现在看来你做了一些小的改变,这似乎有些过头了。但是,如果您必须进行实质性的转换,如新节点、扁平化子节点、转换为csv/txt,XSLT是一个很好的工具,因为您可以避免许多
foreach
循环和
if
逻辑。除此之外,我最近还发现了在PHP和Python中传递参数的方法,我只是想从你的问题中得到乐趣!