How to get all children tags from XML(fast info document) in PHP

给你一囗甜甜゛ 提交于 2020-01-06 07:02:12

问题


I have problem in code when i parse the XML to Array.it returns some tags and not the complete tags.I want to get all tags inside in soap response.I have xml file.and upload this file.

Here is data.txt file below:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="<a rel="nofollow" class="external free" href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>"
  xmlns="urn:enterprise.soap.sforce.com">
  <soapenv:Body>
     <retrieveResponse>
        <result xsi:type="sf:sObject">
           <id>123</id>
           <description>description</description>
           <name>testing</imran>
           <cnic>23198398213</cnic>
        </result>
     </retrieveResponse>
  </soapenv:Body>
</soapenv:Envelope>

My PHP code:

<?php
    ini_set("memory_limit", "44879M");
    include("dom.php");
    $xml = str_get_html( file_get_contents("data.txt") );
    $final = array();
    $result = $xml->find("result");
    foreach($result as $r){

        $tag = $r->children();
        $one = array();
        foreach($tag as $child){
            $tag = $child->tag;
            echo "<pre>";
            print_r($tag); echo "<br>";

            if( stristr($tag, ":") ){
                list($com, $tag) = explode(":", $tag);

            }
            $one[$tag]  =  trim(strip_tags($child->innertext));
        }
        $final[] = $one;
        //print_r($final); exit;
    }
    print_r($final);
?>

My output:

id
description
name
Array
(
    [0] => Array
        (
            [id] => 123
            [description] => description
            [name] => testing             23198398213
        )
)

My expected output should:

id
description
name
cnic
Array
(
    [0] => Array
        (
            [id] => 123
            [description] => description
            [name] => testing   
            [cnic] =>   23198398213       
        )
)

Please help

Thanks in Advance.


回答1:


The problem is caused by simple_html_dom trying to correct your XML. There are a few issues with it and if they were resolved, you could load it much more efficiently with either DOMDocument or SimpleXML.

If you corrected the element

<name>testing</imran>

as the html parser is trying to correct the structure, it's taking this and the <cnic> element as one piece of data. Change this to

<name>testing</name>

and your output changes to...

<pre>id<br><pre>description<br><pre>name<br><pre>cnic<br>Array
(
    [0] => Array
        (
            [id] => 123
            [description] => description
            [name] => testing
            [cnic] => 23198398213
        )

)

If you corrected your XML, then you could do the following (XML included)...

$data = <<< XML
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
    xmlns="urn:enterprise.soap.sforce.com">
  <soapenv:Body>
     <retrieveResponse>
        <result xsi:type="sf:sObject">
           <id>123</id>
           <description>description</description>
           <name>testing</name>
           <cnic>23198398213</cnic>
        </result>
     </retrieveResponse>
  </soapenv:Body>
</soapenv:Envelope>
XML;

$xml = new SimpleXMLElement($data);
$xml->registerXPathNamespace("def", "urn:enterprise.soap.sforce.com");
$result = $xml->xpath("//def:result");
$final = array();
foreach ( $result[0]->children() as $element ) {
    $final [ $element->getName() ] = (string)$element;
}
print_r($final);


来源:https://stackoverflow.com/questions/48821727/how-to-get-all-children-tags-from-xmlfast-info-document-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!