2010-02-10 26 views
7

Estoy trabajando en algunos PHP para crear XML desde una base de datos usando la extensión DOM.PHP DOM XML - Crear múltiples atributos de espacio de nombres?

Básicamente, tengo que crear un espacio de nombres y añadir 3 atributos a la misma:

<NameSpaceName xmlns="uri:xxx" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="uri:xxx"> 

El código completo que he escrito es el siguiente:

include_once("includes/connect.php"); 

$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; 

Pero cuando ejecuto el I anterior obtener este error:

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

La línea 21 es la segunda línea 'setAttributeNS'.

¿Alguien puede ver dónde me está yendo mal?

Respuesta

15

schemaLocation no se ha declarado en el espacio de nombres http://www.w3.org/2000/xmlns/ pero en http://www.w3.org/2001/XMLSchema-instance

<?php 
// 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(); 

impresiones

<?xml version="1.0" encoding="UTF-8"?> 
<PayerRecords xmlns="http://xxx" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://xxx"/> 
2

reemplazar la línea 21 con

$root->setAttributeNS(
    'http://www.w3.org/2001/XMLSchema-instance', 
    'xsi:schemaLocation', 
    'http://xxx http://xxx/xxx.xsd' 
); 

xsi:schemaLocation no está definido en la http://www.w3.org/2000/xmlns/ o el espacio de nombres, pero en xsi. por lo que debe usar el (completo) xsi namespace uri como primer parámetro.

y: no es necesario que llame al setAttributeNS() dos veces: la línea única anterior genera los atributos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" y xsi:schemaLocation="http://xxx http://xxx/xxx.xsd".

3

Yo no entiendo muy bien la primera vez, así que estoy publicar mi respuesta con más detalle . Quizás alguien encuentre esto útil.

// 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) 
$root->setAttributeNS(
    'http://www.w3.org/2001/XMLSchema-instance', 
    'xsi:schemaLocation', 
    'http://namespaceA/url/here/ http://namespaceA/xsdfile/here.xsd'); 

// add new namespace 
$el->setAttributeNS(
    'http://www.w3.org/2000/xmlns/', 
    'xmlns:namespaceB', 
    'http://namespaceB/url/here/'); 

// add root element to DOM 
$xml->appendChild($el); 

Este mensaje de archivo de correo fue muy útil: http://www.mail-archive.com/[email protected]/msg135362.html.

Cuestiones relacionadas