【问题标题】:PHP SOAP XML DOMPHP SOAP XML DOM
【发布时间】:2013-02-01 22:56:08
【问题描述】:

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

`<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;
}

有没有人知道一个简单的方法来做到这一点?我想我已经研究这个很久了。

【问题讨论】:

标签: php xml dom soap xpath


【解决方案1】:

怎么样:

$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++;
}

但是,这会错过&lt;attributes&gt; 组之外的&lt;name&gt; 元素。你的意思是要包括那个吗?

【讨论】:

    【解决方案2】:

    我想出了这一点,并认为它可以帮助其他人

        $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="";
                }
             }
    
         }  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多