<?php $book = simplexml_load_file('sxml.xml'); /* Access the bookinfo child element of the book element */ $bookinfo = $book->bookinfo; /* Access the title child element from the bookinfo element */ $title = $bookinfo->title; ?>
有子元素的元素所对应的SimpleXMLElement对象将返回该对象直属的文本节点,而不是任一子元素的内容。如果用print输出$author,将得到一个27字符长度,包含空格和换行符的字符。 Neither of the child elements,firstname or surname, nor their content is returned in the string.
为了理解最后一点,可以运行一些下面这段代码:
$doc = new SimpleXMLElement('somesubtextthing'); print $doc;
$book = simplexml_load_file('sxml.xml'); /* Modify an unspecified para element where multiple para elements exist */ $book->chapter->para ="Removed CDATA";
输出: Warning: main()[/phpmanual/function.main.html]: Cannot assign to an array of nodes (duplicate subnodes or attr detected)
<holder>Rob Richards</holder> <bookinfo>No Book Info</bookinfo> Warning: SimpleXMLElement::asXML()[/phpmanual/function.asXML.html]: Node no longer exists in N:\CVS Projects\php5\Debug_TS\booksxe.php on line 7
这段代码中,首先将文档中的holder元素赋值给$cholder变量,然后打印该变量。bookinfo元素包含有title,author和 copyright子树,它的内容被字符串No Book Info代替,从bookinfo的输出结果可以看出,它的子树被清空并且被字符串代替了。接着试图再次打印$cholder变量的XML内容,程序输出一个警告,这个变量依然是一个SimpleXMLElement对象,但它所属的节点在bookinfo元素改变时已经被破坏了。
另一种情况。将bookinfo元素中的子元素用字符串 代替。
$book = simplexml_load_file('sxml.xml'); $book->bookinfo ="SimpleXML in PHP 5"; print $book->bookinfo->asXML()."\n";
如果你认为上述代码将bookinfo中的内容清空后再给bookinfo创建了一个子节点title,那么你错了。输出结果是 <title>SimpleXML in PHP 5</title> 实际上bookinfo元素的子元素都被移除了,但是新赋值的XML数据被转义成文本内容,而不是一个新的子元素。
children ()和attributes()方法可以被看做是过滤器,如果没有参数或者传递一个NULL作为参数,这两个方法将返回非命名空间下的元素或属性;否则将返回特定命名空间下的元素或属性。在重置之前,命名空间仍然起作用并且被子节点继承。例如,使用$bookinfo被设置为命名空间http://www.example.com/ns1的对象,可以使用 print $bookinfo->author->firstname来但因author中的firstname元素。所有的元素都在命名空间下,因此你在创建$bookinfo对象时不必一直使用children()设置命名空间。