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