技术开发 频道

在PHP中开发XML应用程序之基础篇

    四、 DOM

    DOM PHP扩展名允许使用W3C DOM API在XML文档上进行操作。在PHP 5出现之前,这是PHP能存取XML文档的唯一方法。如果你在JavaScript中使用了DOM,那么会认识到这些对象模型几乎是一样的。

    由于DOM方法在遍历和操作XML文档时比较罗嗦,所以任何DOM兼容的代码都有明显的优点-与任何其它实现相同的W3C兼容的对象模型的API兼容。

    在下面的实例代码中,我们使用DOM来显示关于每本书的信息。首先,我们遍历一下列表目录,把它们的Id和相应的名字装载到一个索引数组中。然后,我们显示每本书的一个简短描述:

    PHP:

    <?php
    /*这里我们必须指定XML版本:也即是1.0 */
    $xml = new DomDocument('1.0');
    $xml->load('xml/library.xml');
    /*首先,创建一个目录列表*/
    $categories = array();
    $XMLCategories = $xml->getElementsByTagName('categories')->item(0);
    foreach($XMLCategories->getElementsByTagName('category') as $categoryNode) {
    /*注意我们是如何得到属性的*/
    $cid = $categoryNode->getAttribute('cid');
    $categories[$cid] = $categoryNode->firstChild->nodeValue;
    }
    ?>
    <html>
    <head>
    <title>XML Library</title>
    </head>
    <body>
    <?
    php foreach($xml->getElementsBytagName('book') as $book):
    /*查找标题*/
    $title = $book->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
    /*查找作者-为了简化起见,我们假设仅仅有一个作者*/
    $author = $book->getElementsByTagName('author')->item(0)->firstChild->nodeValue;
    /* 列表目录*/
    $bookCategories = $book->getElementsByTagName('category');
    $catList = '';
    foreach($bookCategories as $category) {
    $catList .= $categories[$category->firstChild->nodeValue] . ', ';
    }
    $catList = substr($catList, 0, -2); ?>
    <div>
    <h2><?php echo($title) ?></h2>
    <p><b>Author:</b>: <?php echo($author) ?></p>
    <p><b>Categories: </b>: <?php echo($catList) ?></p>
    </div>
    <? php endforeach; ?>
    </html> 

    再提一下,修改XML是较麻烦的。例如,添加一个目录的代码如下:

    PHP:

    function addCategory(DOMDocument $xml, $catID, $catName) {
    $catName = $xml->createTextNode($catName); //创建一个结点以存储文本
    $category = $xml->createElement('category'); //创建一个目录元素
    $category->appendChild($catName); //把文本添加到目录元素上
    $category->setAttribute('cid', $catID); //设置目录的ID
    $XMLCategories = $xml->getElementsByTagName('categories')->item(0);
    $XMLCategories->appendChild($category); //添加新目录
    } 

0
相关文章