2012-03-12 77 views
1

我需要使用XML中的名稱空間來處理代碼,並對其進行處理。例如:在XML上使用名稱空間

<system:include file="./test.php" cache="true" /> 

這將是內容的最終輸出,但需要處理特殊標籤(如system:include)前發送到客戶端。

因此,我將獲得最終輸出的所有元素,以搜索大約命名空間標記或特定標記。問題是,如果我使用DOMDocument並像XML一樣讀取,則在命名空間聲明(Namespace prefix system on include is not defined in Entity)中遇到一些問題。

我的測試代碼:

<?php 

    $document = new DOMDocument(); 
    $document->loadXML(' 
     <system:include file="./test.php" cache="true" /> 
    '); 

    foreach($document->childNodes as $node) { 
     var_dump($node->nodeName); 
    } 

?> 

我需要做,因爲我需要處理一些特殊的標籤並將其轉換爲真正的HTML。例如:將<b>轉換爲<strong>(只是一個例子!)或者做一些更好的事情,比如使用標籤包含和緩存特定頁面。

又如:

<h7>Hello World!</h7> 

轉換爲:

<div class="h7">Hello World!</div> 

注:ob內容將被髮送給將通過這個特殊的標籤搜索特定的方法。所以我不知道我是否可以在之前聲明命名空間(可能會很難,也可能很慢)。

再見!

回答

2

如果我在XML中指定一個根元素,然後在根元素中聲明系統名稱空間,我可以使其工作。 <root xmlns:system="system">...</root>

<?php 

function dump($root) { 
    foreach($root->childNodes as $node) { 
     echo $node->nodeName; 
     echo "\n"; 
     dump($node); 
    } 
} 

$doc = new DOMDocument(); 
$doc->loadXML('<root xmlns:system="system"><system:include file="./test.php" cache="true" /></root>'); 

dump($doc); 

?> 
+0

好...但如果我不知道命名空間是什麼?因爲我可以有'X'命名空間,我不知道每個命名空間的名稱。只是一個幫助...如果它不可能我認爲我知道我可以做什麼... – 2012-03-12 23:58:38

+0

我不知道如何使DOMDocument解析具有未知命名空間的XML文檔,而不會警告它們。你可以用$ doc-> loadXML('...',LIBXML_NOERROR)來抑制錯誤。 – Martin 2012-03-13 00:07:00