【问题标题】:php - Create element/attribute with an associated namespacephp - 创建具有关联命名空间的元素/属性
【发布时间】:2014-12-02 19:23:39
【问题描述】:

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

它说第二个变量“qualifiedName”必须定义为前缀:标记名,但我发现在某些情况下前缀是自动添加的(我没有在代码中输入它)。我做了一个例子:

<?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 将是相同的...

【问题讨论】:

    标签: php dom xml-namespaces


    【解决方案1】:

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

    前缀,为了更好地维护代码,可以在文档顶部和代码顶部定义一次,如果可以省略,则不必在太多地方更改只需使用不带前缀的名称即可。

    我真的不喜欢将命名空间临时插入到我的文档中,所以只要我能提前知道它们,我就会在开始之前将它们声明在顶部,例如使用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多