2013-02-01 66 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=""; 
      } 
     } 

    }