|
domxml_xmltree
Creates a tree of PHP objects from an XML document
(PHP 4 >= 4.2.0)
Code Examples / Notes » domxml_xmltreejeroen dot s
You can modify the returned DomDocument, and dump it as an XML file by using DomDocument->dump_mem() or DomDocument->dump_file(). colin
This is a genuinely useful function, however, as with any DOM-based markup parser, be mindful of the size of the XML document you are parsing. Representing very large XML files as object structures requires *a lot* of memory and processing, and may even crash your server (which is what happened to my Apache when I tried parsing a 2MB XML file using this function, just for fun... ;).
nutbar
Same concept as previous function, except uses node names as key items in the arrays. This function may prove a bit more useful than the previous one: function domxml_xmlarray($branch) { $object = array(); $objptr = &$object; $branch = $branch->first_child(); while ($branch) { if (!($branch->is_blank_node())) { switch ($branch->node_type()) { case XML_TEXT_NODE: { $objptr['cdata'] = $branch->node_value(); break; } case XML_ELEMENT_NODE: { $objptr = &$object[$branch->node_name()][]; break; } } if ($branch->has_child_nodes()) { $objptr = array_merge($objptr, domxml_xmlarray($branch)); } } $branch = $branch->next_sibling(); } return $object; } Usage is identical to the previous function. 23-feb-2005 02:38
Replacing line 10 works well, but replacing line 15 causes some errors. I have a tree like: <admin> <user level="0"> <username>admin</username> <password>admin_pass</password> </user> <user level="1"> <username>moder</username> <password>moder_pass</password> </user> </admin> when I remove those brackets only the last <user> is included into array. In this example it would be <user level="1"> <username>moder</username> <password>juozux</password> </user> no user name admin, etc. p.s. I don't store passwords in plain text in xml, that was just an example :)) alan71
In the function of nutbar, try to replace line 10 by $objptr = $branch->node_value(); and line 15 by : $objptr = &$object[$branch->node_name()]; //without the '[]' it makes an array much more easier to read. Previously, it produces an array like $MyArray[ROOT][0][BRANCH1][0][BRANCH2][0][5], and now $MyArray[ROOT][BRANCH1][BRANCH2][5]. There isn't bugs in the example I use, and I haven't tested with arguments. I think that an implementation of a part of nospam's code is enough. I hope this will help! samc a t rampantlabs dot net
Forgive me if I am mistaken, but the whole point of including the "useless white space" is because of the existence of mixed types, for example: the schema def: <xsd:element name="paragraph"> <xsd:complexType mixed="true"> <xsd:choice> <xsd:element ref="link" /> <xsd:element ref="emphasisText" /> </xsd:choice> </xsd:complexType> </xsd:element> and an example: <paragraph>This here is a paragraph. You'll notice that it has within it a bunch of text punctuated by other <emphasisText>tags</emphasisText> and it is <link target="me.html>my</url> understanding that the only way to read this text is by reading the tagless nodes that your functions strip.</paragraph> I could be way off though... nospam
Consider the following revisions for including attributes into the array. function domxml_xmlarray ($branch) { $object = Array (); $objptr =& $object; $branch = $branch->first_child (); while ($branch) { if (!($branch->is_blank_node())) { switch ($branch->node_type()) { case XML_TEXT_NODE: { $objptr['cdata'] = $branch->node_value (); break; } case XML_ELEMENT_NODE: { $objptr =& $object[$branch->node_name ()][]; if ($branch->has_attributes ()) { $attributes = $branch->attributes (); if (!is_array ($attributes)) { break; } foreach ($attributes as $index => $domobj) { $objptr[$index] = $objptr[$domobj->name] = $domobj->value; } } break; } } if ($branch->has_child_nodes ()) { $objptr = array_merge ($objptr, domxml_xmlarray ($branch)); } } $branch = $branch->next_sibling (); } return $object; } |
Change LanguageDomAttribute->name DomAttribute->set_value DomAttribute->specified DomAttribute->value DomDocument->add_root DomDocument->create_attribute DomDocument->create_cdata_section DomDocument->create_comment DomDocument->create_element_ns DomDocument->create_element DomDocument->create_entity_reference DomDocument->create_processing_instruction DomDocument->create_text_node DomDocument->doctype DomDocument->document_element DomDocument->dump_file DomDocument->dump_mem DomDocument->get_element_by_id DomDocument->get_elements_by_tagname DomDocument->html_dump_mem DomDocument->xinclude DomDocumentType->entities() DomDocumentType->internal_subset() DomDocumentType->name() DomDocumentType->notations() DomDocumentType->public_id() DomDocumentType->system_id() DomElement->get_attribute_node() DomElement->get_attribute() DomElement->get_elements_by_tagname() DomElement->has_attribute() DomElement->remove_attribute() DomElement->set_attribute_node() DomElement->set_attribute() DomElement->tagname() DomNode->add_namespace DomNode->append_child DomNode->append_sibling DomNode->attributes DomNode->child_nodes DomNode->clone_node DomNode->dump_node DomNode->first_child DomNode->get_content DomNode->has_attributes DomNode->has_child_nodes DomNode->insert_before DomNode->is_blank_node DomNode->last_child DomNode->next_sibling DomNode->node_name DomNode->node_type DomNode->node_value DomNode->owner_document DomNode->parent_node DomNode->prefix DomNode->previous_sibling DomNode->remove_child DomNode->replace_child DomNode->replace_node DomNode->set_content DomNode->set_name DomNode->set_namespace DomNode->unlink_node DomProcessingInstruction->data DomProcessingInstruction->target DomXsltStylesheet->process() DomXsltStylesheet->result_dump_file() DomXsltStylesheet->result_dump_mem() domxml_new_doc domxml_open_file domxml_open_mem domxml_version domxml_xmltree domxml_xslt_stylesheet_doc domxml_xslt_stylesheet_file domxml_xslt_stylesheet domxml_xslt_version xpath_eval_expression xpath_eval xpath_new_context xpath_register_ns_auto xpath_register_ns xptr_eval xptr_new_context |