0

如何使用 PHP 从以下结果中获取值。

<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Header/>
      <soapenv:Body>
        <p558:registerDonorResponse xmlns:p558="http://ws.ots.labcorp.com">
          <p558:registerDonorReturn xmlns:p118="http://data.ws.ots.labcorp.com">
            <p118:clientRegistrationId>clr1</p118:clientRegistrationId>
            <p118:labcorpRegistrationNumber>100059064</p118:labcorpRegistrationNumber>
            <p118:registrationTime>2012-12-01T05:40:51.628Z</p118:registrationTime>
          </p558:registerDonorReturn>
        </p558:registerDonorResponse>
      </soapenv:Body>
    </soapenv:Envelope>

谢谢。

4

2 回答 2

1

您的 XML 包含以名称空间为前缀的标记,因为它在 SOAP 响应中很常见。

查看来自 php 的 SimpleXML 文档的以下评论:

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
    <p:person id="1">John Doe</p:person>
    <p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$ns = $sxe->getNamespaces(true);

$child = $sxe->children($ns['p']);

foreach ($child->person as $out_ns)
{
    echo $out_ns;
}

在您的情况下,访问属性的代码应如下所示(在 so.xml 文件中针对您的 XML 进行了测试):

<?php
  $xml = file_get_contents('so.xml');
  $sxe = simplexml_load_string($xml);

  $ns = $sxe->getNamespaces(true);

  $child =
    $sxe->children($ns['soapenv'])->
      Body->children($ns['p558'])->
      registerDonorResponse->registerDonorReturn->children($ns['p118']);

  var_dump($child);

结果:

$ php -f so.php 
object(SimpleXMLElement)#4 (3) {
  ["clientRegistrationId"]=>
  string(4) "clr1"
  ["labcorpRegistrationNumber"]=>
  string(9) "100059064"
  ["registrationTime"]=>
  string(24) "2012-12-01T05:40:51.628Z"
}

但是请注意,手动发出 SOAP 请求和解析响应通常是一种不好的做法,请考虑为此使用SOAP 客户端

于 2012-12-01T06:10:53.503 回答
0

你试过什么?

无论如何,您可以使用 PHPsimplexml_load_file或全功能DOMDocument class

于 2012-12-01T06:16:21.830 回答