php - 使用 PHP 中的动态命名空间前缀解析 XML 元素

标签 php soap namespaces simplexml

我有以下 XML(你可以说 SOAP 请求):

<SOAPENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS="http://xyz.gov/headerschema" >
    <SOAPENV:Header>
        <NS:myHeader>
            <NS:SourceID>223423</NS:SourceID>
        </NS:myHeader>
    </SOAPENV:Header>
</SOAPENV:Envelope>

我使用以下代码,它工作正常:
<?php 
$myRequest ='<SOAPENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS="http://xyz.gov/headerschema" >
   <SOAPENV:Header>
      <NS:myHeader>
         <NS:SourceID>223423</NS:SourceID>
      </NS:myHeader>
   </SOAPENV:Header>
   </SOAPENV:Envelope>';
$xml = simplexml_load_string($myRequest, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
$namespaces = $xml->getNameSpaces(true);

$soapHeader = $xml->children($namespaces['SOAPENV'])->Header;
$myHeader = $soapHeader->children($namespaces['NS'])->myHeader;
echo (string)$myHeader->SourceID;
?>

问题

我知道前缀 ( SOAPENV + NS ) ,但是客户端可以将前缀更改为他们想要的任何内容,因此他们可能会向我发送具有 ( MY-SOAPENV + MY-NS ) 前缀的 xml 文档。

我的问题

由于命名空间前缀不是静态的,我该如何处理它,我该如何解析它?

谢谢

最佳答案

这是另一种方式。我们可以如下动态解析数据。

$myRequest ='<SOAPENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS="http://xyz.gov/headerschema" >
           <SOAPENV:Header>
              <NS:myHeader>
                 <NS:SourceID>223423</NS:SourceID>
              </NS:myHeader>
           </SOAPENV:Header>
           </SOAPENV:Envelope>';


$xml        = simplexml_load_string(
    $myRequest, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/"
);
$namespaces = $xml->getNameSpaces(true);
$prefix     = array_keys($namespaces); // we getting all namespaces here. According 
                                       // to that we can find datas.
$soapHeader = $xml->children($namespaces[$prefix[0]])->Header;
$myHeader   = $soapHeader->children($namespaces[$prefix[1]])->myHeader;
echo (string)$myHeader->SourceID;

关于php - 使用 PHP 中的动态命名空间前缀解析 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17317126/

相关文章:

javascript - 客户端脚本中的服务器端变量

windows - 如何为 Windows 编写 wsgen 脚本

java - 使用wsgen生成Web服务的Gradle任务

php - 如何从数据库中的列生成下拉菜单的选择列表?

php - OpenID 和 OAuth : successor of lightopenid?

xml - 如何使用 XSL 转换器仅翻译选定的 XML 元素

xml - XSLT 匹配和命名空间

c# - 我应该担心命名空间编号/长度/范围的统治吗?

php - mysql_fetch_array 未从数据库中的字符串中获取结果。 var_dump 显示为 null

php - 我们如何在 Cakephp 中使用 SoapClient...?