/** * Creates a Map of devices from the xml file * * @param string $fileName path to the xml file to parse * @return Map of <deviceId ModelDevice> */ public static function parse($fileName, $validationSchema) { $devicesMap = array(); $deviceID = null; $groupID = null; $reader = new XMLReader(); $reader->open($fileName); $fullFileName = dirname(__FILE__) . DIRECTORY_SEPARATOR . $validationSchema; $reader->setRelaxNGSchema($fullFileName); libxml_use_internal_errors(TRUE); while ($reader->read()) { if (!$reader->isValid()) { throw new Exception(libxml_get_last_error()->message); } $nodeName = $reader->name; switch ($reader->nodeType) { case XMLReader::ELEMENT: switch ($nodeName) { case WURFL_Xml_Interface::DEVICE: $groupIDCapabilitiesMap = array(); $deviceID = $reader->getAttribute(WURFL_Xml_Interface::ID); $userAgent = $reader->getAttribute(WURFL_Xml_Interface::USER_AGENT); $fallBack = $reader->getAttribute(WURFL_Xml_Interface::FALL_BACK); $actualDeviceRoot = $reader->getAttribute(WURFL_Xml_Interface::ACTUAL_DEVICE_ROOT); $currentCapabilityNameValue = array(); if ($reader->isEmptyElement) { $device = new WURFL_Xml_ModelDevice($deviceID, $userAgent, $fallBack, $actualDeviceRoot); $devicesMap[$deviceID] = $device; } break; case WURFL_Xml_Interface::GROUP: $groupID = $reader->getAttribute(WURFL_Xml_Interface::GROUP_ID); $groupIDCapabilitiesMap[$groupID] = array(); break; case WURFL_Xml_Interface::CAPABILITY: $capabilityName = $reader->getAttribute(WURFL_Xml_Interface::CAPABILITY_NAME); $capabilityValue = $reader->getAttribute(WURFL_Xml_Interface::CAPABILITY_VALUE); $currentCapabilityNameValue[$capabilityName] = $capabilityValue; $groupIDCapabilitiesMap[$groupID][$capabilityName] = $capabilityValue; break; } break; case XMLReader::END_ELEMENT: if ($nodeName == WURFL_Xml_Interface::DEVICE) { $device = new WURFL_Xml_ModelDevice($deviceID, $userAgent, $fallBack, $actualDeviceRoot, $groupIDCapabilitiesMap); $devicesMap[$device->id] = $device; } break; } } // end of while $reader->close(); return $devicesMap; }
protected function _getReader($data, $request) { if (!is_bool($request)) { } /// @TODO $this->_currentNode = NULL; $reader = new XMLReader(); $reader->xml($data, NULL, LIBXML_NONET | LIBXML_NOENT); if ($this->_validate) { if ('@data_dir@' != '@' . 'data_dir' . '@') { $schema = '@data_dir@' . DIRECTORY_SEPARATOR . 'pear.erebot.net' . DIRECTORY_SEPARATOR . 'XRL'; } else { $schema = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'data'; } $schema .= DIRECTORY_SEPARATOR; $schema .= $request ? 'request.rng' : 'response.rng'; $reader->setRelaxNGSchema($schema); } return $reader; }
<?php $file = '/etc/passwd' . chr(0) . 'asdf'; $reader = new XMLReader(); var_dump($reader->open($file)); var_dump($reader->setRelaxNGSchema($file));
while ($reader->read()) { } } if ($reader->isValid()) { print "file relaxNG: ok\n"; } else { print "file relaxNG: failed\n"; } $reader->close(); unlink($file); $reader = new XMLReader(); $reader->XML($xmlstring); if ($reader->setRelaxNGSchema($relaxngfile)) { while ($reader->read()) { } } if ($reader->isValid()) { print "string relaxNG: ok\n"; } else { print "string relaxNG: failed\n"; } $reader->close(); $reader = new XMLReader(); $reader->XML($xmlstring); if ($reader->setRelaxNGSchema('')) { echo 'failed'; } $reader->close(); ?> ===DONE===
<?php $indent = 5; /* Number of spaces to indent per level */ $reader = new XMLReader(); $reader->open('relaxNG.xml'); /* Example setting relaxNG using string: $reader->setRelaxNGSchemaSource(file_get_contents('relaxNG.rng')); */ if ($reader->setRelaxNGSchema('relaxNG.rng')) { while ($reader->read()) { /* Print node name indenting it based on depth and $indent var */ print str_repeat(" ", $reader->depth * $indent) . $reader->name . "\n"; } } print "\n"; if (!$reader->isValid()) { print "Document is not valid\n"; } else { print "Document is valid\n"; }
/** * Returns an XML reader for some data. * * \param string $URI * URI to the XML data to process. * * \param bool $request * Whether the data refers to an XML-RPC * request (\c true) or a response (\c false). * * \retval XMLReader * An XML reader for the given data. * * \throw InvalidArgumentException * You tried to pass something that is not * a boolean as the \c $request parameter. * * \note * The reader is set to validate the document * on the fly if that's what this decoder was * configured to do during construction. */ protected function getReader($URI, $request) { if (!is_string($URI)) { throw new \InvalidArgumentException('Not a string'); } if (!is_bool($request)) { throw new \InvalidArgumentException('Not a boolean'); } $this->currentNode = null; $reader = new \XMLReader(); $reader->open($URI, null, LIBXML_NONET | LIBXML_NOENT); if ($this->validate) { $schema = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR; $schema .= $request ? 'request.rng' : 'response.rng'; $reader->setRelaxNGSchema($schema); } return $reader; }
/** * validates the xml string * * @return boolean true if the xml string is valid * @access private */ private function validateString($xml_feed_string) { $reader = new XMLReader(); $reader->XML($xml_feed_string); if ($reader->setRelaxNGSchema(RELAX_NG_IMPORT_SCHEMA)) { while ($reader->read()) { } } if (!$reader->isValid()) { return false; } $reader->close(); return true; }
public function setRelaxNGSchema($filename) { return parent::setRelaxNGSchema($filename); }