PHP birden şemalara karşı xml doğrulamak ya da ben nedense benim şemaları birleştirmek zorunda mümkün olup olmadığını merak ediyorum.
Bir cevap için teşekkürler!
Ben basit bir PHP komut dosyası ile benim problem çözdük:
$mainSchemaFile = dirname(__FILE__) . "/main-schema.xml";
$additionalSchemaFile = 'second-schema.xml';
$additionalSchema = simplexml_load_file($additionalSchemaFile);
$additionalSchema->registerXPathNamespace("xs", "http://www.w3.org/2001/XMLSchema");
$nodes = $additionalSchema->xpath('/xs:schema/*');
$xml = '';
foreach ($nodes as $child) {
$xml .= $child->asXML() . "\n";
}
$result = str_replace("</xs:schema>", $xml . "</xs:schema>", file_get_contents($mainSchemaFile));
var_dump($result); // merged schema in form XML (string)
Ama bu şemalar aynı olduğunu aslında sadece sayesinde mümkün - yani
<xs:schema xmlns="NAMESPACE"
targetNamespace="NAMESPACE"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
Her iki dosya olduğunu.
DOMDocument::schemaValidate
yöntem parametre olarak şema dosyasının yolunu aldığı göz önüne alındığında, ben sadece bunu yöntemini birkaç kez aramak zorunda olduğunu söylemek istiyorum: bir zamanlar her biri için sizin şemalar.
PHP dizeleri sizin şemalar varsa DOMDocument::schemaValidateSource
Ayrıca bakınız; Fikir (and the answer) olsa, aynı olacaktır: sadece yöntemini birkaç kez aramak.
Syfmony2 geliştiriciler bu sorun çözüldü. Bu 'Temiz Heyecanlandım değil ama yapacak:
function validateSchema(\DOMDocument $dom)
{
$tmpfiles = array();
$imports = '';
foreach ($this->schemaLocations as $namespace => $location) {
$parts = explode('/', $location);
if (preg_match('#^phar://#i', $location)) {
$tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
if ($tmpfile) {
file_put_contents($tmpfile, file_get_contents($location));
$tmpfiles[] = $tmpfile;
$parts = explode('/', str_replace('\\', '/', $tmpfile));
}
}
$drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
$location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
$imports .= sprintf(' <xsd:import namespace="%s" schemaLocation="%s" />' . PHP_EOL, $namespace, $location);
}
$source = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns="http://symfony.com/schema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://symfony.com/schema"
elementFormDefault="qualified">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
$imports
</xsd:schema>
EOF
;
$current = libxml_use_internal_errors(true);
$valid = $dom->schemaValidateSource($source);
foreach ($tmpfiles as $tmpfile) {
@unlink($tmpfile);
}
if (!$valid) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors()));
}
libxml_use_internal_errors($current);
}