在XML上使用命名空间


Using namespaces on 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内容将被发送到一个特定的方法,该方法将通过此特殊标记进行搜索。所以我不知道我之前是否可以进行名称空间声明(可能会很难而且很慢)。

再见!

如果我在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);
?>