PHP DOM XML - создать несколько атрибутов пространства имен? - PullRequest
7 голосов
/ 10 февраля 2010

Я работаю над некоторым 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'.

Кто-нибудь может увидеть, где я иду не так?

Ответы [ 3 ]

17 голосов
/ 10 февраля 2010

Расположение схемы не объявлено в пространстве имен 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"/>
3 голосов
/ 04 июня 2013

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

// 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.

2 голосов
/ 10 февраля 2010

заменить строку 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 пространство имен uri в качестве первого параметра.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...