创建具有关联命名空间的元素/属性


Create element/attribute with an associated namespace

I'm look'm DOMDocument::createElementNS documentation at : http://php.net/manual/en/domdocument.createelementns.php

说第二个变量"qualifiedName"必须定义为前缀: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) 命名空间中该前缀下面的项目也开始继承更本地的前缀,即使它以前使用更全局的前缀。这在某些情况下可能很有用,尽管我不确定为什么。