PHP DOM XML – создание нескольких атрибутов пространства имен?

Я работаю над некоторым PHP для создания XML из базы данных с использованием расширения DOM.

В принципе, мне нужно создать NameSpace и добавить к нему 3 атрибута:

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

Полный код, который я написал, приведен ниже:

 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; 

Но когда я выполняю вышеуказанное, я получаю эту ошибку:

Неустранимая ошибка: исключение «DOMException» с сообщением «Ошибка пространства имен» в xml.php: 21 Трассировка стека: # 0 xml.php (21): DOMElement-> setAttributeNS (' http: //www.w3.o … ',' xsi: schemaLocat … ',' uri: xxx … ') # 1 {main} брошен в xml.php в строке 21

Строка 21 является второй строкой setAttributeNS.

Может ли кто-нибудь увидеть, где я ошибаюсь?

schemaLocation не объявляется в пространстве имен http://www.w3.org/2000/xmlns/ но в 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(); 

печать

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

Я не совсем понял это в первый раз, поэтому я отправляю свой ответ более подробно. Может быть, кто-то найдет это полезным.

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

Это сообщение почтового архива было очень полезно: http://www.mail-archive.com/php-general@lists.php.net/msg135362.html .

замените линию 21 на

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

xsi:schemaLocation не определен в http://www.w3.org/2000/xmlns/ или вашем пространстве имен, но в xsi . поэтому вы должны использовать (полный) xsi namespace uri в качестве первого параметра.

и: вам не нужно дважды вызывать setAttributeNS() : одна строка выше генерирует как xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" и xsi:schemaLocation="http://xxx http://xxx/xxx.xsd" .