dom — Создать элемент / атрибут со связанным пространством имен

Я смотрю документацию 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 будет таким же …

1

Решение

Я тоже это нашел.
DRY предполагает, что если вы можете избежать этого, вам НЕ следует добавлять префиксы самостоятельно, если только у вас нет причин манипулировать тем, как документ обрабатывает пространства имен.

Префикс, в частности, для лучшего сопровождения кода, может быть определен один раз в верхней части документа и в верхней части кода, и его не нужно будет менять в слишком многих местах, если вы можете опустить его и просто использовать имена с префиксом.

Мне действительно не нравится вставлять пространства имен в свои документы в произвольном порядке, поэтому всякий раз, когда я могу знать их заранее, я объявляю их в начале, прежде чем начать, например, с

  $wrapper->setAttributeNS('http://www.w3.org/2000/xmlns/', "xmlns:rdfs", $rdfs_ns);

Я обнаружил, что если я добавлю элемент с уже известным пространством имен, но с другим префиксом (добавленным вручную) позже в документе, то элементы ниже этого в том же пространстве (URI) также начнут наследовать более локальный префикс, даже если он Ранее использовал более глобальный. Это может быть полезно в некоторых случаях, хотя я не уверен, почему.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]