Я смотрю документацию DOMDocument :: createElementNS по адресу: http://php.net/manual/en/domdocument.createelementns.php
в нем говорится, что вторая переменная «qualName» должна быть определена как префикс: tagname, но я обнаружил, что в некоторых случаях префикс добавляется автоматически (без того, чтобы я не вводил его в код). Я сделал экзамен:
<?php
//Namespaces url
$NS_xx = 'http://xxx';
$NS_yy = 'http://yyy';
$domxml = new DomDocument('1.0', 'UTF-8');
$Country = $domxml->appendChild ($domxml->createElementNS($NS_xx, 'xx:Country')); // Manually entered prefix
$Country->setAttributeNS($NS_xx, 'id', '1'); // Automatically added prefix in result
$State = $Country->appendChild ($domxml->createElementNS($NS_xx,'State')); // Automatically added prefix in result
$Region = $State->appendChild ($domxml->createElementNS($NS_yy, 'yy:Region')); // Manually entered prefix
$Region->setAttributeNS($NS_xx, 'id', '5'); // Automatically added prefix in result
$Town = $Region->appendChild ($domxml->createElement('Town'));
$Town->appendChild ($domxml->createElementNS($NS_yy, 'F', 'New York')); // Automatically added prefix in result
$Town->setAttributeNS($NS_xx, 'zip', '10001'); // Automatically added prefix in result
Header('Content-type: text/xml');
$domxml->formatOutput = true;
echo $domxml->saveXML();
?>
Это возвращает:
<?xml version="1.0" encoding="UTF-8"?>
<xx:Country xmlns:xx="http://xxx" xx:id="1">
<xx:State>
<yy:Region xmlns:yy="http://yyy" xx:id="5">
<Town xx:zip="10001">
<yy:F>New York</yy:F>
</Town>
</yy:Region>
</xx:State>
</xx:Country>
Мне кажется, что префикс будет добавлен автоматически, если он был ранее добавлен в любой из родительских элементов. Есть ли какая-либо причина добавлять этот префикс в любом случае каждый раз в коде?
Если я добавлю эти префиксы вручную в свой код, как сказано в документации, результат xml будет таким же …
Я тоже это нашел.
DRY предполагает, что если вы можете избежать этого, вам НЕ следует добавлять префиксы самостоятельно, если только у вас нет причин манипулировать тем, как документ обрабатывает пространства имен.
Префикс, в частности, для лучшего сопровождения кода, может быть определен один раз в верхней части документа и в верхней части кода, и его не нужно будет менять в слишком многих местах, если вы можете опустить его и просто использовать имена с префиксом.
Мне действительно не нравится вставлять пространства имен в свои документы в произвольном порядке, поэтому всякий раз, когда я могу знать их заранее, я объявляю их в начале, прежде чем начать, например, с
$wrapper->setAttributeNS('http://www.w3.org/2000/xmlns/', "xmlns:rdfs", $rdfs_ns);
Я обнаружил, что если я добавлю элемент с уже известным пространством имен, но с другим префиксом (добавленным вручную) позже в документе, то элементы ниже этого в том же пространстве (URI) также начнут наследовать более локальный префикс, даже если он Ранее использовал более глобальный. Это может быть полезно в некоторых случаях, хотя я не уверен, почему.
Других решений пока нет …