我有一个肥皂xml,但我在不使用索引的情况下获取值的挑战。
xml:
<?xml version="1.0" encoding="UTF-8"?>
<Result xmlns="http://api-v1.gen.mm.vodafone.com/mminterface/result">
<ResultType>0</ResultType>
<ResultCode>0</ResultCode>
<ResultDesc>The service request is processed successfully.</ResultDesc>
<ResultParameters>
<ResultParameter>
<Key>TransactionAmount</Key>
<Value>500</Value>
</ResultParameter>
<ResultParameter>
<Key>TransactionReceipt</Key>
<Value>LIB967VYGF</Value>
</ResultParameter>
</ResultParameters>
<ReferenceData>
<ReferenceItem>
<Key>QueueTimeoutURL</Key>
<Value>https://xx.xx.xx.xx:8080/NotificationService?wsdl</Value>
</ReferenceItem>
</ReferenceData>
</Result>
要获取值,我解析xml;
$xml=simplexml_load_string($response) or die("Error: Cannot create object");
然后从对象中获取值;
$ResultType=$xml->ResultType;
$ResultCode=$xml->ResultCode;
$ResultDesc= $xml->ResultDesc;
<ResultParameters>
标签上的其他内容是挑战。
我希望除了索引之外还能以任何其他安全方式获取它们,因为这可能会改变。如果<ResultParameter>
互换,则会失败。
这就是我做的事情;
$Amount= $xml->ResultParameters->ResultParameter[0]->Value;
$TransactionReceipt= $xml->ResultParameters->ResultParameter[1]->Value;
任何人都在这里分享这个秘密。
答案 0 :(得分:1)
使用XPath,您可以找到<Key>TransactionAmount</Key>
条目并从那里跟踪值。但是作为XPath,默认的命名空间类型会受到阻碍。因此每个元素必须由prefix:elementName。
首先注册命名空间(给它一些更简单的前缀),然后使用<Key>
作为起点来检索它。
$xml=simplexml_load_string($response);
$xml->registerXPathNamespace("default", "http://api-v1.gen.mm.vodafone.com/mminterface/result");
$amount= (string)$xml->xpath("//default:Key[text()='TransactionAmount']/../default:Value/text()")[0];
echo "Amount=".$amount.PHP_EOL;
当->xpath
返回一个数组时 - 你只需要从中获取第一个项目。但这仍然是一个对象,所以强制转换为字符串会使它更有用(通常)。
为您需要的任何其他值做类似的事情。