2010-02-10 5 views
7

Je travaille sur PHP pour créer du XML à partir d'une base de données en utilisant l'extension DOM.PHP DOM XML - Créer plusieurs attributs d'espace de noms?

Fondamentalement, je dois créer un espace de nommage et ajouter 3 lui attribue:

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

Le code complet j'ai écrit est ci-dessous:

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; 

Mais quand j'exécute ce qui précède, je obtenir cette erreur:

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 ligne 21 est la deuxième ligne 'setAttributeNS'.

Quelqu'un peut-il voir où je vais mal?

Répondre

15

schemaLocation est pas déclarée dans l'espace de noms http://www.w3.org/2000/xmlns/ mais 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(); 

impressions

<?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

Substituer à la ligne 21 avec

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

xsi:schemaLocation n'est pas défini dans le http://www.w3.org/2000/xmlns/ ou votre espace de noms, mais dans xsi. vous devez donc utiliser l'uri (complet) xsi namespace comme premier paramètre. Et: vous n'avez pas besoin d'appeler setAttributeNS() deux fois: la seule ligne ci-dessus génère les attributs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" et xsi:schemaLocation="http://xxx http://xxx/xxx.xsd".

3

Je ne comprends pas bien la première fois alors je poste ma réponse plus détaillée . Peut-être que quelqu'un trouve cela utile.

// 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); 

Ce message d'archive a été très utile: http://www.mail-archive.com/[email protected]/msg135362.html.