2013-02-01 69 views
0

我有一个soap xml,其中包含一些我需要访问的变量。这是XML。PHP SOAP XML DOM

`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <searchPersonsResponse xmlns=""> 
     <searchPersonsReturn> 
      <attributes> 
       <attributes> 
        <name>ercreatedate</name> 
        <values> 
        <values>201104070130Z</values> 
        </values> 
       </attributes> 
       <attributes> 
        <name>status</name> 
        <values> 
        <values>Stuff1</values> 
        <values>Stuff2</values> 
        <values>Stuff3</values> 
        <values>Stuff4</values> 
        <values>Stuff5</values> 
        <values>Stuff6</values> 
        <values>Stuff7</values> 
        </values> 
       </attributes> 
      </attributes> 

      <itimDN>blah</itimDN> 
      <name>Smith, Bob</name> 
      <profileName>PER</profileName> 
      <select>false</select> 
     </searchPersonsReturn> 
     </searchPersonsResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

我试图访问内部属性节点并拉出名称和值到一个多维数组这样的....

$array["status"][0]="stuff1"; 
$array["status"][1]="stuff2"; 
$array["status"][2]="stuff3"; 
$array["status"][3]="stuff4"; 

到目前为止,我已经能够访问节点,但没有真正按照我想要的方式得到它们。这里是我一直在玩的代码.....

$dom_document = new DOMDocument(); 

$dom_document->loadXML($thexml); 

$tag_els_names = $dom_document->getElementsByTagname('name'); 
$tag_els_values = $dom_document->getElementsByTagname('values'); 

$data = array(); 
$data2 = array(); 
foreach($tag_els_names as $node){ 
    $data[] = array($node->nodeName => $node->nodeValue); 
//grabs all the <name> node values 
} 
$i=0;$j=0; 
foreach($tag_els_values as $node){ 
    $j=0; 


    foreach($node->childNodes as $child) { 


      $data2[$i][$j] = $child->nodeValue; 
        //grabs all the value node values  
     $j++; 
    } 
    $i++; 

    $j=0; 
} 

有没有人知道一个简单的方法来做到这一点?我认为我一直在考虑这一点。

+0

你为什么解析SOAP XML,你不会是使用原生SOAP功能的更好吗? http://php.net/manual/en/class.soapclient.php – thaJeztah

+0

肥皂函数不允许我需要的灵活性。 – user710440

回答

0

如何像:

$dom_document = new DOMDocument(); 

$dom_document->loadXML($thexml); 

$xpath = new DOMXpath($dom_document); 

$attr = $xpath->evaluate("//attribute/attributes"); 

$names = array(); 
$values = array(); 
$i = 0; 
foreach($attr as $attr_node) { 
    $values[i] = array(); 
    foreach($xpath->evaluate("name", $attr_node) as $name){ 
     $names[] = $name->nodeValue; 
    } 
    $foreach($xpath->evaluate("value", $attr_node) as $value){ 
     $values[i][] = $value->nodeValue; 
    } 
    i++; 
} 

这,然而,错过了<name>元素那是<attributes>组之外。你的意思是包括那个吗?

0

我想通了这一点,并认为这可以帮助别人

$doc = new DOMDocument(); 
    $values=array(); 

    if ($doc->loadXML($temp)) { 
     $attributes = $doc->getElementsByTagName('attributes'); 

     foreach($attributes as $attribute) { 
      if($attribute->childNodes->length) { 
       $previous_nodeValue=""; 
        foreach($attribute->childNodes as $i) { 
         if($i->nodeValue=="status"){ 
          $previous_nodeValue=$i->nodeValue; 
         } 
         if($i->nodeName=="values" && $previous_nodeValue== "status"){ 

          foreach($i->childNodes as $j){ 
           $values[]=$j->nodeValue; 

          } 
         } 
        } 
       $previous_nodeValue=""; 
      } 
     } 

    }