simplify DOM api
| From: | Andreas Korthaus | Date: | Sun, 05 Mar 2006 18:56:08 +0000 |
| Subject: | simplify DOM api | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-231486@lists.php.net to get a copy of this message | ||
Hi Rob!
Rob wrote:
$node = new DOMElement("root"); In this case the element is not associated with a document. In DOM, you really aren't supposed to have a node not associated with any document, but this syntax allows the DOM classes to be extended in PHP. Once the node is associated with a document, you then have full editing capabilities.Again, very helpful information - thanks a lot! I have to do something like: <?php $array_of_book_objects = array('...'); $doc = new DOMDocument('1.0'); $books = $doc->appendChild(new DOMElement('books')); foreach($array_of_book_objects as $book_data) { $book = $books->appendChild(new DOMElement('book')); $book->setAttribute('isbn', xml_entity_encode($book_data->isbn)); $book->appendChild(new DOMElement('title',
xml_entity_encode($book_data->title)));$book->appendChild(new DOMElement('description',
xml_entity_encode($book_data->description)));$author = $book->appendChild(new DOMElement('author')); $author->appendChild(new DOMElement('name',
xml_entity_encode($book_data->author_name)));} echo $doc->saveXML(); ?> Because my script is by far more complex (but does not use more advanced DOM features), I'd like to simplify the DOM api a little bit more. With extending DOMElement I think I have found a nice way: <?php class SimpleDOMElement extends DOMElement { function addChild($name, $value=NULL) {
if (is_null($value)) {
return $this->appendChild(new SimpleDOMElement($name));
}
else {
return $this->appendChild(new SimpleDOMElement($name,
xml_entity_encode($value)));
}
}
function addAttribute($name, $value) {
return $this->setAttribute($name, xml_entity_encode($value));} } class Books extends DOMDocument { private $books_element; function __construct() {
parent::__construct('1.0');
$this->books_element = $this->appendChild(
new SimpleDOMElement('books'));
}
function addBook($book_object) {
$book = $this->books_element->addChild('book');
$book->addAttribute('isbn', $book_object->isbn);
$book->addChild('title', $book_object->title);
$book->addChild('description', $book_object->description);
$author = $book->addChild('author');
$author->addChild('name', $book_object->author_name);
}
}
$array_of_book_objects = array('...');
$books = new Books;
foreach ($array_of_book_objects as $book_data) {
$books->addBook($book_data);
}
echo $books->saveXML();
?>
I think this should be OK, or shouldn't I do it this way?
Perhaps you have seen that I've used a "xml_entity_encode()" function. This function works like htmlspecialchars(), but replaces ' with ' and not '. Or do all of you use htmlspecialchars()? Does it work with Unicode strings?
best regards
Andreas