user2511210
user2511210

Reputation: 93

simplexml doesn't read CDATA

I want to grab data from a xml file from a remote location which contains CDATA information in all nodes as listed below. I use the following PHP function to grab such information but it doesn't work and seems not to be able to catch CDATA tags from xml file. the question is whether my piece of code is correct or not ? and if it's wrong can you suggest any php code to get requested information?

<Items>
      <Item ID="1">
          <Name>Mountain</Name>
          <Properties>
              <Property Code="feature"><![CDATA[<ul><li>sample text</li></ul>]]></Property>
              <Property Code="SystemRequirements"><![CDATA[Windows XP/Windows Vista]]></Property>
              <Property Code="Description" Type="plain"><![CDATA[sample text2]]></Property>
          </Properties>
      </Item>
<Items>

and this is my php code :

  <?
    function xmlParse($file, $wrapperName, $callback, $limit = NULL) {
        $xml = new XMLReader();
        if (!$xml->open($file)) {
            die("Failed to open input file.");
        }
        $n = 0;
        $x = 0;
        while ($xml->read()) {
            if ($xml->nodeType == XMLReader::ELEMENT && $xml->name == $wrapperName) {
                while ($xml->read() && $xml->name != $wrapperName) {
                    if ($xml->nodeType == XMLReader::ELEMENT) {
                        //$subarray[]=$xml->expand();
                        $doc = new DOMDocument('1.0', 'UTF-8');
                        $simplexml = simplexml_import_dom($doc->importNode($xml->expand(), true));
                        $subarray[]=$simplexml;
                    }
                }
                if ($limit == NULL || $x < $limit) {
                    if ($callback($subarray)) {
                        $x++;
                    }
                    unset($subarray);
                }
                $n++;
            }
        }
        $xml->close();
    }

    echo '<pre>';

    function func1($s) {
        print_r($s);
    }

    xmlParse('myfile.xml', 'Item', 'func1', 100);

When I print this object by print_r($s); I can't see CDATA in result !. do you have any idea in order to retrieve CDATA context ?

Upvotes: 1

Views: 1870

Answers (2)

Baba
Baba

Reputation: 95161

Treat it like a string

$file = "1.xml";
$xml = simplexml_load_file($file);
foreach($xml->Item->Properties->children() as $properties) {
    printf("%s", $properties);
}

Output

<ul><li>sample text</li></ul>
Windows XP/Windows Vista
sample text2

Upvotes: 1

copypaste
copypaste

Reputation: 175

There is allways way to use DOMDocument to open xml files, for example:

$xmlFile = new DOMDocument();
$xmlFile->load(myfile.xml);
echo $xmlFile->getElementsByTagName('Property')->item(0)->nodeValue;

Upvotes: 0

Related Questions