(PHP 4 >= 4.2.0)
domxml_open_file — Creates a DOM object from an XML file
The function parses the XML document in the given file.
The path to the XML file. The file is accessed in read-only mode.
This optional parameter can be used to change the behavior of this function.
You can use one of the following constants for it: DOMXML_LOAD_PARSING (default), DOMXML_LOAD_VALIDATING or DOMXML_LOAD_RECOVERING. You can add to it also DOMXML_LOAD_DONT_KEEP_BLANKS, DOMXML_LOAD_SUBSTITUTE_ENTITIES and DOMXML_LOAD_COMPLETE_ATTRS by bitwise or.
If used, it will contain the error messages. error must be passed in by reference.
Returns a DomDocument instance of the given file.
Beispiel #1 Opening an XML document from a file
<?php
if (!$dom = domxml_open_file("example.xml")) {
echo "Error while parsing the document\n";
exit;
}
$root = $dom->document_element();
?>
Version | Beschreibung |
---|---|
4.3.0 | The parameters mode and error were added. |
The way to order the nodes in XML-files by an attribute (desc or asc):
<?php
// open the XML-file
$xml = domxml_open_file("our_file.xml");
// get the root element
$root = $xml->document_element();
// get the list of the nodes
$nodes = $root->child_nodes();
// create the array 'messages' of the nodes
foreach($nodes as $node)
{
if ($node->node_name() == 'photo')
{
$currentMessage['thumbnail'] = $node->get_attribute('thumbnail');
$currentMessage['filename'] = $node->get_attribute('filename');
$currentMessage['idnum'] = $picnum[md5($node->get_attribute('filename'))];
$messages[] = $currentMessage;
}
}
// sort all the nodes by idnum (asc/desc is "1: -1" or "-1: 1")
$compare_func = create_function('$a, $b', 'return ($a[\'idnum\']==$b[\'idnum\'])? 0: (($a[\'idnum\']>$b[\'idnum\'])? 1: -1);');
usort($messages, $compare_func);
// create the new XML-data
$doc = domxml_new_doc("1.0");
$root = $doc->create_element("photos");
$root = $doc->append_child($root);
for($ee=0;$ee<count($messages);$ee++)
{
$msgNode = $root->new_child('photo');
foreach($messages[$ee] as $description => $result)
{
$msgNode->set_attribute($description,$result);
}
}
// write down the XML-file
$text = $doc->dump_mem(true);
$fp = fopen("our_file.xml","w");
fwrite($fp,$text);
fclose($fp);
?>
A very useful undocumented feature if you are opening hundreds of xml docs (my script processes 20,000) is DomDocument->free.
This clears the allocated the memory used by the xml file which is not done automatically by just opening a new file on the same variable.
Example:
<?
$dir="/path/to/xml/files/";
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if(is_file($dir.$file))
{
echo $file . "\\n";
$dom=domxml_open_file($dir.$file);
#...
#You xml processor here
#...
$dom->free();
}
}
closedir($dh);
}
?>
another way to resolve path's problem is to use realpath() function
for example:
<?php
$file=$_REQUEST['file'];
$xmlPath = realpath("../xml/");
$fileXML ="$file";
if(!$dom = domxml_open_file($xmlPath."/".$fileXML)) {
echo "error opening the file";
exit;
}
?>
N.B. you have to put the final slash ( / ) beetween path and file name!
For me, on Windows XP, the solution with file_get_contents works, the one with domxml_open_file does not. It seems the latter caches the loaded file. Quite confusing.
If you want to work on both Windows and Linux, I found appending the following to the front of your file path works:
$xmlPath = dirname(__FILE__) . "/";
$xmlDOM = domxml_open_file($xmlPath . "file.xml");
(rather than the "\\" in a previous post on this page which only works on Windows).
This should get around the I/O errors.
You can load your own DTD's within your XML Doc like this:
<?php
$domxml = domxml_open_file('test.xml',DOMXML_LOAD_VALIDATING,$error);
?>
I hope this helps....
The DocumentType Definition (must/have) to be in the Doc root of your Server...
If you're working on a windows machine and don't want to use full paths , just use...
$showfile = file_get_contents($path . "/" . $fileName);
if(!$domDoc = domxml_open_mem($showfile)) {
echo "Couldn't load xml...";
exit;
}
Because file_get_contents() can use relative paths on Win, it keeps your code more portable...
twist
domxml documentation is a moving target, for 4.2.3 a working example is:
<?
$xmlpath = dirname(__FILE__) . "\\";
$xmldoc = domxml_open_file( $xmlpath . "test.xml");
$xsldoc = domxml_xslt_stylesheet_file ( $xmlpath . "test.xsl");
$result = $xsldoc->process($xmldoc);
print $result->dump_mem();
?>
RTFS is a working method in this case (lucky guesses work also from time tor time) :-)
Using PHP 4.2.3 and Win2K.
The XML file needs to be referenced using the full filesystem path name, even if its in the same directory.
Using PHP 4.1.2, Win2K, IIS.
I found that if the path to the XML source file is too long then the file isn't picked up. I haven't tested it to see how long the path can be or whether this is still an issue in PHP 4.2