Home » Php » PHP DOM XML – Create Multiple Namespace Attributes?

PHP DOM XML – Create Multiple Namespace Attributes?

Posted by: admin July 12, 2020 Leave a comment


I’m working on some PHP to create XML from a database using the DOM extension.

Basically, I need to create a NameSpace and add 3 attributes to it:

<NameSpaceName xmlns="uri:xxx"

The full code i’ve written is below:


$sql = ("SELECT * FROM tableName");
$query = mysql_query($sql) or die("Error: " . mysql_error());

// create a new XML document
$doc = new DomDocument('1.0', 'UTF-8');

// create root node
$root = $doc->createElementNS('uri:xxx', 'PayerRecords');
$root = $doc->appendChild($root);
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xsi:schemaLocation', 'uri:xxx');

// process one row at a time
while($row = mysql_fetch_assoc($query)) {

  // add node for each row
  $occ = $doc->createElement('Content');
  $occ = $root->appendChild($occ);

  // add a child node for each field
  foreach ($row as $fieldname => $fieldvalue) {

    $child = $doc->createElement($fieldname);
    $child = $occ->appendChild($child);

    $value = $doc->createTextNode($fieldvalue);
    $value = $child->appendChild($value);

  } // foreach

} // while

// get completed xml document
$xml_string = $doc->saveXML();

echo $xml_string;

But when I execute the above I get this error:

Fatal error: Uncaught exception
‘DOMException’ with message ‘Namespace
Error’ in
Stack trace: #0
DOMElement->setAttributeNS(‘http://www.w3.o…’, ‘xsi:schemaLocat…’,
‘uri:xxx…’) #1 {main} thrown
on line 21

Line 21 is the second ‘setAttributeNS’ line.

Can anyone see where i’m going wrong?

How to&Answers:

schemaLocation is not declared in the namespace http://www.w3.org/2000/xmlns/ but in http://www.w3.org/2001/XMLSchema-instance

// create a new XML document
$doc = new DomDocument('1.0', 'UTF-8');
// create root node
$root = $doc->createElementNS('http://xxx', 'PayerRecords');
$root = $doc->appendChild($root);
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$root->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation', 'http://xxx');

echo $doc->savexml();


<?xml version="1.0" encoding="UTF-8"?>
<PayerRecords xmlns="http://xxx" 


I didn’t quite get it the first time so I’m posting my answer in more detail. Maybe someone finds this helpful.

// create DOM document
$xml = new DomDocument('1.0', 'UTF-8');

// create root element
$el = $xml->createElementNS('http://namespaceA/url/here/', 'rootelement');

// to be able to add new namespaces we must first add namespace 'xsi'
// third parameter is important (use your main namespace with .xsd)
  'http://namespaceA/url/here/ http://namespaceA/xsdfile/here.xsd');

// add new namespace

// add root element to DOM

This mail archive message was very helpful: http://www.mail-archive.com/[email protected]/msg135362.html.


replace line 21 with

  'http://xxx http://xxx/xxx.xsd'

xsi:schemaLocation is not defined in the http://www.w3.org/2000/xmlns/ or your namespace, but in xsi. so you have to use the (complete) xsi namespace uri as the first parameter.

and: you don’t need to call setAttributeNS() twice: the single line above generates both the xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" and xsi:schemaLocation="http://xxx http://xxx/xxx.xsd" attributes.