2014-12-02 46 views
0

我要找的DOMDocument :: createElementNS文件在創建元素/屬性標記名,但我發現在某些情況下,前綴是自動添加的(沒有我在代碼中輸入)。我做了一個examle:PHP有關聯的命名空間

<?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)名稱空間下的項目也開始繼承更多本地前綴,儘管它是以前使用更全球的。這在某些情況下可能會有用,但我不知道爲什麼。

+0

感謝您的回覆 – Mario 2015-03-06 13:32:27