如何从soap xml上的键获取值

时间:2017-09-12 13:58:55

标签: php xml soap

我有一个肥皂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; 

任何人都在这里分享这个秘密。

1 个答案:

答案 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返回一个数组时 - 你只需要从中获取第一个项目。但这仍然是一个对象,所以强制转换为字符串会使它更有用(通常)。

为您需要的任何其他值做类似的事情。