2012-03-12 73 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