PHP更改XML节点值
我在使用PHP更改XML节点值时遇到了一些困难 我的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
<?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中传递参数的方法,我只是想从你的问题中得到乐趣!