Xpoint
   [напомнить пароль]

добавление namespace в XML

Метки: [без меток]
2007-10-29 22:24:35 [обр] alan[досье]

Начал разбираться с созданием XML и ODF файлов и столкнулся с первой проблемой :
как добавлять namespaces?

Нужно получить след. код :

<?xml version="1.0" encoding="UTF-8"?>
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"

С созданием одного понятно:

$doc = new DOMDocument('1.0','UTF-8');
$document_content = $doc->createElementNS('urn:oasis:names:tc:opendocument:xmlns:office:1.0', 'office:document-content');

Как добавить остальные namespaces ?

спустя 17 часов [обр] Давид Мзареулян(536/1003)[досье]
А если просто — setAttributeNS('xmlns', 'style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0') — не работает?
спустя 19 часов [обр] alan[досье]

Более менее разобрался:

Создаем основу докумета content.xml

$nsOffice = 'urn:oasis:names:tc:opendocument:xmlns:office:1.0';
$nsText = 'urn:oasis:names:tc:opendocument:xmlns:text:1.0';


$doc = new DOMDocument('1.0', 'UTF-8');
$elementDocument = $doc->createElementNS($nsOffice, 'office:document-content');

// создание нужного namespace в корневом элементе через атрибут
//$elementDocument->appendChild($doc->createAttributeNS($nsText, 'text:text'));
//$elementDocument->removeAttribute('text:text');

// добавление namespace
$elementDocument->setAttributeNodeNs(new DOMAttr('xmlns:text',$nsText));
//$elementDocument->setAttribute('xmlns:text', $nsText);

$doc->appendChild($elementDocument);

$elementBody = $doc->createElementNS($nsOffice, 'office:body');
$elementDocument->appendChild($elementBody);

$elementText = $doc->createElementNS($nsOffice, 'office:text');
$elementBody->appendChild($elementText);

то при добавление текста

$elementText->appendChild($doc->createElementNS($nsText, 'text:p', utf8('просто текст')));

в результирующем коде для элемента <text:p> будет описан namespace, и заданный через
setAttributeNodeNs namespace для корневого элемента не сработал.

    <?xml version="1.0" encoding="UTF-8"?>
    <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
      <office:body>
        <office:text>
          <text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">просто текст</text:p>
        </office:text>
      </office:body>
    </office:document-content>

в книге Костерова как раз был указан данный момент, что
для добавления namespace в корневой елемент, нужно создать атрибут с нужным namespace , а потом его удалить.
В коде я описал данный момент и он работает, но это как-то через пятое место.

Получается что в данном случае нужно расширять DOMDocument и делать отработку добавления в корневой элемент не описанных
namespace.

Powered by POEM™ Engine Copyright © 2002-2005