php - 使用关联的命名空间创建元素/属性

时间:2014-12-02 19:23:40

标签: php dom xml-namespaces

我正在查看DOMDocument :: createElementNS文档:http://php.net/manual/en/domdocument.createelementns.php

它说第二个变量“qualifiedName”必须定义为prefix: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 个答案:

答案 0 :(得分:1)

我也发现了这一点。 DRY会建议如果你可以避免它,你不应该自己添加前缀,除非你有理由操纵文档处理命名空间的方式。

为了更好的代码维护,前缀可以在文档的顶部和代码的顶部定义一次,如果你可以将其删除,就不必在太多地方进行更改只需使用未加前缀的名称。

我真的不喜欢在我的文档中特意插入名称空间,所以每当我能提前知道它们时,我会在开始之前将它们声明为顶部,例如

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

我发现如果我在文档中添加一个已知名称空间但后面有一个不同前缀(手动添加)的元素,那么同一(URI)命名空间下面的项目也开始继承更多的本地前缀,即使它之前使用的是更全球的。这在某些情况下可能有用,但我不确定原因。