本文整理汇总了PHP中DOMDocument::lookupNamespaceUri方法的典型用法代码示例。如果您正苦于以下问题:PHP DOMDocument::lookupNamespaceUri方法的具体用法?PHP DOMDocument::lookupNamespaceUri怎么用?PHP DOMDocument::lookupNamespaceUri使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DOMDocument
的用法示例。
在下文中一共展示了DOMDocument::lookupNamespaceUri方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: __construct
/**
* Build DOM with initial XML contents and specifying identifier attributes for merging
*
* Format of $idAttributes: array('/xpath/to/some/node' => 'id_attribute_name')
* The path to ID attribute name should not include any attribute notations or modifiers -- only node names
*
* @param string $xml
* @param array $idAttributes
* @param string $typeAttributeName
* @param string $schemaFile
* @param string $errorFormat
*/
public function __construct($xml, array $idAttributes = array(), $typeAttributeName = null, $schemaFile = null, $errorFormat = self::ERROR_FORMAT_DEFAULT)
{
$this->_schemaFile = $schemaFile;
$this->_nodeMergingConfig = new Dom\NodeMergingConfig(new Dom\NodePathMatcher(), $idAttributes);
$this->_typeAttributeName = $typeAttributeName;
$this->_errorFormat = $errorFormat;
$this->_dom = $this->_initDom($xml);
$this->_rootNamespace = $this->_dom->lookupNamespaceUri($this->_dom->namespaceURI);
}
示例2: parseXmlStream
function parseXmlStream($content, $field_mapping)
{
$res = array();
$xml = new DOMDocument();
$xml->loadXML($content);
$xpath = new DOMXpath($xml);
$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI);
$xpath->registerNamespace('x', $rootNamespace);
foreach ($field_mapping as $skey => $sval) {
$path = preg_replace("/\\/([a-zA-Z])/", "/x:\$1", $skey);
$elements = $xpath->query($path);
if (!is_null($elements)) {
$ele_cnt = 1;
foreach ($elements as $element) {
foreach ($sval as $field => $innerpath) {
$ipath = preg_replace(array("/^([a-zA-Z])/", "/\\/([a-zA-Z])/"), array("x:\$1", "/x:\$1"), $innerpath);
$val = $xpath->query($ipath, $element)->item(0)->textContent;
if ($val) {
$field_details = explode(':', $field);
$res[$field_details[0]][$ele_cnt][$field_details[1]] = $val;
}
}
$ele_cnt++;
}
}
}
return $res;
}
示例3: addCertificate
/**
* Add Certificate to the Role
*
* @param string $roleName
* @param RemoteDesktopCertificate $certificate
*/
public function addCertificate($roleName, RemoteDesktopCertificate $certificate)
{
$namespaceUri = $this->dom->lookupNamespaceUri($this->dom->namespaceURI);
$xpath = new \DOMXpath($this->dom);
$xpath->registerNamespace('sc', $namespaceUri);
$xpathExpression = '//sc:Role[@name="' . $roleName . '"]//sc:Certificates';
$certificateList = $xpath->evaluate($xpathExpression);
if ($certificateList->length == 1) {
$certificatesNode = $certificateList->item(0);
foreach ($certificatesNode->childNodes as $certificateNode) {
$certificatesNode->removeElement($certificateNode);
}
} else {
$certificatesNode = $this->dom->createElementNS($namespaceUri, 'Certificates');
$roleNodeList = $xpath->evaluate('//sc:Role[@name="' . $roleName . '"]');
if ($roleNodeList->length == 0) {
throw new \RuntimeException("No Role found with name '" . $roleName . "'.");
}
$roleNode = $roleNodeList->item(0);
$roleNode->appendChild($certificatesNode);
}
$certificateNode = $this->dom->createElementNS($namespaceUri, 'Certificate');
$certificateNode->setAttribute('name', 'Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption');
$certificateNode->setAttribute('thumbprint', $certificate->getThumbprint());
$certificateNode->setAttribute('thumbprintAlgorithm', 'sha1');
$certificatesNode->appendChild($certificateNode);
$this->save();
}
示例4: copyForDeployment
/**
* Copy ServiceConfiguration over to build directory given with target path
* and modify some of the settings to point to development settings.
*
* @param string $targetPath
* @return void
*/
public function copyForDeployment($targetPath, $development = true)
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->loadXML($this->dom->saveXML());
$xpath = new \DOMXpath($dom);
$xpath->registerNamespace('sc', $dom->lookupNamespaceUri($dom->namespaceURI));
$settings = $xpath->evaluate('//sc:ConfigurationSettings/sc:Setting[@name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"]');
foreach ($settings as $setting) {
if ($development) {
$setting->setAttribute('value', 'UseDevelopmentStorage=true');
} else {
if (strlen($setting->getAttribute('value')) === 0) {
if ($this->storage) {
$setting->setAttribute('value', sprintf('DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s', $this->storage['accountName'], $this->storage['accountKey']));
} else {
throw new \RuntimeException(<<<EXC
ServiceConfiguration.csdef: Missing value for
'Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString'.
You have to modify the app/azure/ServiceConfiguration.csdef to contain
a value for the diagnostics connection string or better configure
'windows_azure_distribution.diagnostics.accountName' and
'windows_azure_distribution.diagnostics.accountKey' in your
app/config/config.yml
If you don't want to enable diagnostics you should delete the
connection string elements from ServiceConfiguration.csdef file.
EXC
);
}
}
}
}
$dom->save($targetPath . '/ServiceConfiguration.cscfg');
}
示例5: __construct
/**
* Build DOM with initial XML contents and specifying identifier attributes for merging
*
* Format of $idAttributes: array('/xpath/to/some/node' => 'id_attribute_name')
* The path to ID attribute name should not include any attribute notations or modifiers -- only node names
*
* @param string $xml
* @param \Magento\Framework\Config\ValidationStateInterface $validationState
* @param array $idAttributes
* @param string $typeAttributeName
* @param string $schemaFile
* @param string $errorFormat
*/
public function __construct($xml, \Magento\Framework\Config\ValidationStateInterface $validationState, array $idAttributes = [], $typeAttributeName = null, $schemaFile = null, $errorFormat = self::ERROR_FORMAT_DEFAULT)
{
$this->validationState = $validationState;
$this->schema = $schemaFile;
$this->nodeMergingConfig = new Dom\NodeMergingConfig(new Dom\NodePathMatcher(), $idAttributes);
$this->typeAttributeName = $typeAttributeName;
$this->errorFormat = $errorFormat;
$this->dom = $this->_initDom($xml);
$this->rootNamespace = $this->dom->lookupNamespaceUri($this->dom->namespaceURI);
}
示例6: getInfo
public function getInfo($sUrl)
{
$oDom = new \DOMDocument();
if (!@$oDom->load(static::API_URL . $this->getVideoId($sUrl))) {
return false;
}
$this->oData = new \DOMXPath($oDom);
$sRootNameSpace = $oDom->lookupNamespaceUri($oDom->namespaceURI);
$this->oData->registerNamespace('media', $sRootNameSpace);
return $this;
}
示例7: loadXml
static function loadXml($xml, $nsPrefix = 'd')
{
$dom = new \DOMDocument();
@$dom->loadXML($xml);
$xpath = new \DomXPath($dom);
$rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI);
if ($rootNamespace) {
if ($dom->documentElement->getAttribute('xmlns:d')) {
Debug::toss('Namespace prefix "' . $nsPrefix . '" taken');
}
$xpath->registerNamespace($nsPrefix, $rootNamespace);
$nsPrefix .= ':';
} else {
$nsPrefix = '';
}
return array($dom, $xpath, $nsPrefix);
}
示例8: __construct
/**
* Constructor.
*
* @param resource|string $xml The package.xml as stream or path.
*/
public function __construct($xml, $factory = null)
{
if (is_resource($xml)) {
rewind($xml);
} else {
$this->_path = $xml;
$xml = fopen($xml, 'r');
}
$old_libxml_use_errors = libxml_use_internal_errors(true);
$this->_xml = new DOMDocument('1.0', 'UTF-8');
$this->_xml->loadXML(stream_get_contents($xml));
foreach (libxml_get_errors() as $error) {
switch ($error->level) {
case LIBXML_ERR_WARNING:
$error_str = 'Warning ';
break;
case LIBXML_ERR_ERROR:
$error_str = 'Error ';
break;
case LIBXML_ERR_FATAL:
$error_str = 'Fatal error ';
break;
}
$error_str .= $error->code . ': ';
$error_str .= trim($error->message) . ' on file ';
$error_str .= $this->_path . ', line ' . $error->line . ' column ' . $error->column;
fwrite(STDERR, "{$error_str}\n");
}
libxml_clear_errors();
libxml_use_internal_errors($old_libxml_use_errors);
$rootNamespace = $this->_xml->lookupNamespaceUri($this->_xml->namespaceURI);
$this->_xpath = new DOMXpath($this->_xml);
if ($rootNamespace !== null) {
$this->_xpath->registerNamespace('p', $rootNamespace);
$this->_namespace_prefix = 'p:';
}
if ($factory === null) {
$this->_factory = new Horde_Pear_Package_Xml_Factory();
} else {
$this->_factory = $factory;
}
}
示例9: _initDom
/**
* @override
* @see \Magento\Framework\Config\Dom::_initDom()
* @param string $xml
* @return \DOMDocument
* @throws \Magento\Framework\Config\Dom\ValidationException
*/
protected function _initDom($xml)
{
/** @var string $defaultSchema */
$defaultSchema = $this->schema;
/** @var \DOMDocument $dom */
$dom = new \DOMDocument();
$dom->loadXML($xml);
// Возвращает строку вида: «urn:magento:module:Magento_Config:etc/system_file.xsd»
/** @var string $schema */
$schema = $dom->documentElement->getAttributeNS($dom->lookupNamespaceUri('xsi'), 'noNamespaceSchemaLocation');
/**
* Используем df_starts_with($customSchema, 'urn:')
* для совместимости с устаревшим и нигде в ядре не используемым форматом
* с обратными файловыми путями: ../
*
* 2016-06-07
* Раньше тут стояло:
* if ($schema && && df_starts_with($schema, 'urn:')
* Однако сторонние модули используют хуёвые невалидные схемы типа
* urn:magento:framework:Backend/etc/system_file.xsd
* что приводило к сбоям.
*/
if ($schema && 'urn:magento:module:Df_Config:etc/system_file.xsd' === $schema) {
/**
* Переводить схему в формат файлового пути необязательно:
* https://github.com/magento/magento2/blob/2335247d4ae2dc1e0728ee73022b0a244ccd7f4c/lib/internal/Magento/Framework/Config/Dom/UrnResolver.php#L69-L71
* https://github.com/magento/magento2/blob/2335247d4ae2dc1e0728ee73022b0a244ccd7f4c/lib/internal/Magento/Framework/Config/Dom/UrnResolver.php#L26-L55
*/
$this->schema = $schema;
}
/** @var \DOMDocument $result */
try {
$result = parent::_initDom($xml);
} finally {
$this->schema = $defaultSchema;
}
return $result;
}
示例10: about
/**
* This function will load an extension's meta information given the extension
* `$name`. Since Symphony 2.3, this function will look for an `extension.meta.xml`
* file inside the extension's folder. If this is not found, it will initialise
* the extension and invoke the `about()` function. By default this extension will
* return an associative array display the basic meta data about the given extension.
* If the `$rawXML` parameter is passed true, and the extension has a `extension.meta.xml`
* file, this function will return `DOMDocument` of the file.
*
* @deprecated Since Symphony 2.3, the `about()` function is deprecated for extensions
* in favour of the `extension.meta.xml` file.
* @param string $name
* The name of the Extension Class minus the extension prefix.
* @param boolean $rawXML
* If passed as true, and is available, this function will return the
* DOMDocument of representation of the given extension's `extension.meta.xml`
* file. If the file is not available, the extension will return the normal
* `about()` results. By default this is false.
* @return array
* An associative array describing this extension
*/
public static function about($name, $rawXML = false)
{
// See if the extension has the new meta format
if (file_exists(self::__getClassPath($name) . '/extension.meta.xml')) {
try {
$meta = new DOMDocument();
$meta->load(self::__getClassPath($name) . '/extension.meta.xml');
$xpath = new DOMXPath($meta);
$rootNamespace = $meta->lookupNamespaceUri($meta->namespaceURI);
if (is_null($rootNamespace)) {
throw new Exception(__('Missing default namespace definition.'));
} else {
$xpath->registerNamespace('ext', $rootNamespace);
}
} catch (Exception $ex) {
throw new SymphonyErrorPage(__('The %1$s file for the %2$s extension is not valid XML: %3$s', array('<code>extension.meta.xml</code>', '<code>' . $name . '</code>', '<br /><code>' . $ex->getMessage() . '</code>')));
}
// If `$rawXML` is set, just return our DOMDocument instance
if ($rawXML) {
return $meta;
}
// Load <extension>
$extension = $xpath->query('/ext:extension')->item(0);
$about = array('name' => $xpath->evaluate('string(ext:name)', $extension), 'status' => array());
// find the latest <release> (largest version number)
$latest_release_version = '0.0.0';
foreach ($xpath->query('//ext:release', $extension) as $release) {
$version = $xpath->evaluate('string(@version)', $release);
if (version_compare($version, $latest_release_version, '>')) {
$latest_release_version = $version;
}
}
// Load the latest <release> information
if ($release = $xpath->query("//ext:release[@version='{$latest_release_version}']", $extension)->item(0)) {
$about += array('version' => $xpath->evaluate('string(@version)', $release), 'release-date' => $xpath->evaluate('string(@date)', $release));
// If it exists, load in the 'min/max' version data for this release
$required_version = null;
$required_min_version = $xpath->evaluate('string(@min)', $release);
$required_max_version = $xpath->evaluate('string(@max)', $release);
$current_symphony_version = Symphony::Configuration()->get('version', 'symphony');
// Min version
if (!empty($required_min_version) && version_compare($current_symphony_version, $required_min_version, '<')) {
$about['status'][] = EXTENSION_NOT_COMPATIBLE;
$about['required_version'] = $required_min_version;
} else {
if (!empty($required_max_version) && version_compare($current_symphony_version, $required_max_version, '>')) {
$about['status'][] = EXTENSION_NOT_COMPATIBLE;
$about['required_version'] = $required_max_version;
}
}
}
// Add the <author> information
foreach ($xpath->query('//ext:author', $extension) as $author) {
$a = array('name' => $xpath->evaluate('string(ext:name)', $author), 'website' => $xpath->evaluate('string(ext:website)', $author), 'email' => $xpath->evaluate('string(ext:email)', $author));
$about['author'][] = array_filter($a);
}
} else {
$obj = self::getInstance($name);
$about = $obj->about();
// If this is empty then the extension has managed to not provide
// an `about()` function or an `extension.meta.xml` file. So
// ignore this extension even exists
if (empty($about)) {
return array();
}
$about['status'] = array();
}
$about['handle'] = $name;
$about['status'] = array_merge($about['status'], self::fetchStatus($about));
return $about;
}
示例11: about
/**
* This function will load an extension's meta information given the extension
* `$name`. Since Symphony 2.3, this function will look for an `extension.meta.xml`
* file inside the extension's folder. If this is not found, it will initialise
* the extension and invoke the `about()` function. By default this extension will
* return an associative array display the basic meta data about the given extension.
* If the `$rawXML` parameter is passed true, and the extension has a `extension.meta.xml`
* file, this function will return `DOMDocument` of the file.
*
* @param string $name
* The name of the Extension Class minus the extension prefix.
* @param boolean $rawXML
* If passed as true, and is available, this function will return the
* DOMDocument of representation of the given extension's `extension.meta.xml`
* file. If the file is not available, the extension will return the normal
* `about()` results. By default this is false.
* @throws Exception
* @throws SymphonyErrorPage
* @return array
* An associative array describing this extension
*/
public static function about($name, $rawXML = false)
{
// See if the extension has the new meta format
if (file_exists(self::__getClassPath($name) . '/extension.meta.xml')) {
try {
$meta = new DOMDocument();
$meta->load(self::__getClassPath($name) . '/extension.meta.xml');
$xpath = new DOMXPath($meta);
$rootNamespace = $meta->lookupNamespaceUri($meta->namespaceURI);
if (is_null($rootNamespace)) {
throw new Exception(__('Missing default namespace definition.'));
} else {
$xpath->registerNamespace('ext', $rootNamespace);
}
} catch (Exception $ex) {
Symphony::Engine()->throwCustomError(__('The %1$s file for the %2$s extension is not valid XML: %3$s', array('<code>extension.meta.xml</code>', '<code>' . $name . '</code>', '<br /><code>' . $ex->getMessage() . '</code>')));
}
// Load <extension>
$extension = $xpath->query('/ext:extension')->item(0);
// Check to see that the extension is named correctly, if it is
// not, then return nothing
if (self::__getClassName($name) !== self::__getClassName($xpath->evaluate('string(@id)', $extension))) {
return array();
}
// If `$rawXML` is set, just return our DOMDocument instance
if ($rawXML) {
return $meta;
}
$about = array('name' => $xpath->evaluate('string(ext:name)', $extension), 'handle' => $name, 'github' => $xpath->evaluate('string(ext:repo)', $extension), 'discuss' => $xpath->evaluate('string(ext:url[@type="discuss"])', $extension), 'homepage' => $xpath->evaluate('string(ext:url[@type="homepage"])', $extension), 'wiki' => $xpath->evaluate('string(ext:url[@type="wiki"])', $extension), 'issues' => $xpath->evaluate('string(ext:url[@type="issues"])', $extension), 'status' => array());
// find the latest <release> (largest version number)
$latest_release_version = '0.0.0';
foreach ($xpath->query('//ext:release', $extension) as $release) {
$version = $xpath->evaluate('string(@version)', $release);
if (version_compare($version, $latest_release_version, '>')) {
$latest_release_version = $version;
}
}
// Load the latest <release> information
if ($release = $xpath->query("//ext:release[@version='{$latest_release_version}']", $extension)->item(0)) {
$about += array('version' => $xpath->evaluate('string(@version)', $release), 'release-date' => $xpath->evaluate('string(@date)', $release));
// If it exists, load in the 'min/max' version data for this release
$required_min_version = $xpath->evaluate('string(@min)', $release);
$required_max_version = $xpath->evaluate('string(@max)', $release);
$current_symphony_version = Symphony::Configuration()->get('version', 'symphony');
// Remove pre-release notes from the current Symphony version so that
// we don't get false erros in the backend
$current_symphony_version = preg_replace(array('/dev/i', '/-?beta\\.?\\d/i', '/-?rc\\.?\\d/i', '/.0/i'), '', $current_symphony_version);
// Munge the version number so that it makes sense in the backend.
// Consider, 2.3.x. As the min version, this means 2.3 onwards,
// for the max it implies any 2.3 release. RE: #1019
// Also remove any .0 when doing the comparison to prevent extensions
// that don't use semver yet. RE: #2146
$required_min_version = preg_replace(array('/\\.x/', '/\\.0$/'), '', $required_min_version);
$required_max_version = preg_replace(array('/\\.x/', '/\\.0$/'), 'p', $required_max_version);
// Min version
if (!empty($required_min_version) && version_compare($current_symphony_version, $required_min_version, '<')) {
$about['status'][] = Extension::EXTENSION_NOT_COMPATIBLE;
$about['required_version'] = $required_min_version;
// Max version
} elseif (!empty($required_max_version) && version_compare($current_symphony_version, $required_max_version, '>')) {
$about['status'][] = Extension::EXTENSION_NOT_COMPATIBLE;
$about['required_version'] = str_replace('p', '.x', $required_max_version);
}
}
// Add the <author> information
foreach ($xpath->query('//ext:author', $extension) as $author) {
$a = array('name' => $xpath->evaluate('string(ext:name)', $author), 'website' => $xpath->evaluate('string(ext:website)', $author), 'github' => $xpath->evaluate('string(ext:name/@github)', $author), 'email' => $xpath->evaluate('string(ext:email)', $author));
$about['author'][] = array_filter($a);
}
$about['status'] = array_merge($about['status'], self::fetchStatus($about));
return $about;
} else {
Symphony::Log()->pushToLog(sprintf('%s does not have an extension.meta.xml file', $name), E_DEPRECATED, true);
return array();
}
}
示例12: replaceXml
public function replaceXml($file)
{
$dom = new \DOMDocument('1.0', 'UTF-8');
if ($dom->load($file) === true) {
$xpath = new \DOMXPath($dom);
$textNodes = $xpath->query('//text()');
unset($xpath);
foreach ($textNodes as $textNode) {
if (ctype_space($textNode->wholeText) === false) {
$string = trim($textNode->wholeText);
if (strlen($string) > 1 && !is_numeric($string)) {
$nodeName = $textNode->parentNode->nodeName;
if (strpos($nodeName, ':') !== false) {
list($prefix, $suffix) = explode(':', $nodeName, 2);
$nodeName = $dom->lookupNamespaceUri($prefix) . ':' . $suffix;
}
if (in_array($nodeName, self::$replace)) {
//$replacement = mb_substr($lstrnig, mb_strpos($lstrnig, ' ',rand(0, 2000))+1, strlen($string));
$replacement = mb_substr(self::$replacement, rand(0, 1300), strlen($string), "UTF-8");
$textNode->data = $replacement;
} elseif (!in_array($nodeName, self::$leave)) {
throw new UndefinedStrategy('Unknown Tag "' . $nodeName . '" with value "' . $string . '"');
}
}
}
}
} else {
echo '[EE] "' . $file . '" is not a valid XML file' . PHP_EOL;
}
if (!$this->dryRun) {
$dom->save($file);
}
$xpath = new \DOMXPath($dom);
$xpath->registerNamespace('xi', 'http://www.w3.org/2001/XInclude');
foreach ($xpath->query('//xi:include') as $node) {
$includefile = dirname($file) . DIRECTORY_SEPARATOR . $node->getAttribute('href');
$this->addXml($includefile);
}
$this->done[] = $file;
}
示例13: inspect
/**
* @param OutputInterface $output
* @param \SplFileInfo $feed
* @param string $filterExpression
*
* @return array<array, integer>
*/
protected function inspect(OutputInterface $output, \SplFileInfo $feed, $filterExpression)
{
$options = LIBXML_NOENT | LIBXML_NONET | LIBXML_COMPACT | LIBXML_PARSEHUGE | LIBXML_NOERROR | LIBXML_NOWARNING;
$this->reader = new \XMLReader($options);
$this->reader->open($feed->getPathname());
$this->reader->setParserProperty(\XMLReader::SUBST_ENTITIES, true);
libxml_clear_errors();
libxml_use_internal_errors(true);
libxml_disable_entity_loader(true);
$total = 0;
$results = [];
$output->writeln(sprintf('Reading <comment>%s</comment>', $feed->getFilename()));
if ($filterExpression) {
$output->writeln(sprintf('Filtering nodes with expression "<info>%s</info>"', $filterExpression));
}
$progress = new ProgressBar($output);
$progress->start();
// go through the whole thing
while ($this->reader->read()) {
if ($this->reader->nodeType === \XMLReader::ELEMENT && $this->reader->name === 'listing') {
$progress->advance();
++$total;
$node = $this->reader->expand();
$doc = new \DOMDocument();
$doc->appendChild($node);
$xpath = new \DOMXPath($doc);
$xpath->registerNamespace('x', $doc->lookupNamespaceUri($doc->namespaceURI));
$query = $xpath->evaluate($filterExpression, $node);
$result = $query instanceof \DOMNodeList ? $query->length : !empty($query);
if ($result) {
$results[] = $node;
}
}
}
$progress->finish();
$output->writeln('');
return [$results, $total];
}
示例14: extractCoordsKML
/**
* function_description
*
* @param string $xml track xml object
*
* @return array
*/
private function extractCoordsKML($xml)
{
// TODO use XMLReader
$xmldom = new DOMDocument();
$xmldom->loadXML($xml->asXML());
$rootNamespace = $xmldom->lookupNamespaceUri($xmldom->namespaceURI);
$xpath = new DomXPath($xmldom);
$xpath->registerNamespace('kml', $rootNamespace);
$documentNodes = $xpath->query('kml:Document/kml:name|kml:Document/kml:description');
$gps_file_name = '';
$gps_file_description = '';
// Search for NAME (Title) and description of GPS file
foreach ($documentNodes as $documentNode) {
switch ($documentNode->nodeName) {
case 'name':
$gps_file_name .= preg_replace('/<!\\[CDATA\\[(.*?)\\]\\]>/s', '', $documentNode->nodeValue);
break;
case 'description':
$gps_file_description .= preg_replace('/<!\\[CDATA\\[(.*?)\\]\\]>/s', '', $documentNode->nodeValue);
break;
}
}
// Search for tracks (name (title), description and coordinates
$placemarkNodes = $xpath->query('//kml:Placemark');
$this->trackCount = 0;
$tracks_description = '';
$track_name = '';
foreach ($placemarkNodes as $placemarkNode) {
$nodes = $xpath->query('.//kml:name|.//kml:description|.//kml:LineString|.//kml:coordinates', $placemarkNode);
if ($nodes) {
$found_linestring = false;
$name = '';
$description = '';
$coordinates = null;
foreach ($nodes as $node) {
switch ($node->nodeName) {
case 'name':
$name = $node->nodeValue;
break;
case 'description':
$description = $node->nodeValue;
$tracks_description .= $description;
$description = ($description = ' ') ? '' : $description;
break;
case 'LineString':
$found_linestring = true;
break;
case 'coordinates':
// Exploit coordinates only when it is a child of LineString
if ($found_linestring) {
$coordinates = $this->extractKmlCoordinates($node->nodeValue);
if ($coordinates) {
$coordinatesCount = count($coordinates);
$this->trackCount++;
$this->track[$this->trackCount] = new stdClass();
$this->track[$this->trackCount]->coords = $coordinates;
$this->track[$this->trackCount]->start = $coordinates[0][0] . "," . $coordinates[0][1];
$this->track[$this->trackCount]->stop = $coordinates[$coordinatesCount - 1][0] . "," . $coordinates[$coordinatesCount - 1][1];
}
}
break;
}
}
}
if ($this->trackCount and $coordinates) {
$this->track[$this->trackCount]->trackname = $name ? $name : $description;
$this->track[$this->trackCount]->description = $description;
}
// Use description and name for file description
if ($name or $description) {
$gps_file_description .= '<br />' . $name . ':' . $description;
}
}
if ($this->trackCount) {
// GPS file name (title) and description
$this->trackname = $gps_file_name;
if (strlen($gps_file_name) > 2) {
$this->trackname = $gps_file_name;
}
if (strlen($this->trackname) < 10 and $this->trackCount == 1) {
$this->trackname .= $this->track[1]->trackname;
}
if (strlen($this->trackname) < 10) {
$this->trackname .= $this->gpsFile;
}
if ($gps_file_description and $tracks_description) {
$this->description = $gps_file_description . '<br />' . $tracks_description;
} elseif ($tracks_description) {
$this->description = $tracks_description;
} else {
$this->description = $this->trackname;
}
$this->isTrack = $this->trackCount > 0;
//.........这里部分代码省略.........