Отслеживание объявлений пространства имен с помощью XMLWriter - PullRequest
2 голосов
/ 15 июня 2009

Я работаю над веб-сервисом XML (на PHP!), И чтобы сделать все правильно, я хочу использовать XMLWriter вместо простого объединения строк и надеяться на лучшее.

Я использую пространства имен XML везде, используя -> startElementNS и -> writeElementNS. Проблема в том, что каждый раз, когда я использую эти функции, также записывается новое объявление пространства имен.

Хотя это правильный синтаксис, он немного не нужен. Я хотел бы убедиться, что мое объявление пространства имен пишется только в первый раз, когда оно используется в контексте документа.

Есть ли простой способ сделать это с XMLWriter, или я застрял в подклассах и управляю этим вручную.

Спасибо, Эверт

Ответы [ 2 ]

6 голосов
/ 26 сентября 2011

Вы можете записать пространство имен один раз в нужное место в документе, например в верхнем элементе:

$writer = new XMLWriter(); 
$writer->openURI('php://output'); 
$writer->startDocument('1.0'); 

$writer->startElement('sample');            
$writer->writeAttributeNS('xmlns','foo', null,'http://foo.org/ns/foo#');
$writer->writeAttributeNS('xmlns','bar', null, 'http://foo.org/ns/bar#');

$writer->writeElementNS('foo','quz', null,'stuff here');
$writer->writeElementNS('bar','quz', null,'stuff there');

$writer->endElement();
$writer->endDocument();
$writer->flush(true);

Это должно закончиться чем-то вроде

<?xml version="1.0"?>
<sample xmlns:foo="http://foo.org/ns/foo#" xmlns:bar="http://foo.org/ns/bar#">
 <foo:quz>stuff here</foo:quz>
 <bar:quz>stuff there</bar:quz>
</sample>

Раздражающий xmlwriter не отслеживает эти объявления - он позволяет вам писать недопустимый xml. Также раздражает, что атрибут обязателен, даже если он может быть нулевым - и это третий аргумент, а не последний.

$ 2с, * -Pike

6 голосов
/ 15 июня 2009

Вы можете передать NULL в качестве параметра uri.

<?php
$w = new XMLWriter;
$w->openMemory();
$w->setIndent(true);
$w->startElementNS('foo', 'bar', '<a href="http://whatever/foo" rel="noreferrer">http://whatever/foo</a>');
$w->startElementNS('foo', 'baz', null);
$w->endElement();
$w->endElement();
echo $w->outputMemory();
печать
<foo:bar xmlns:foo="http://whatever/foo">
 <foo:baz/>
</foo:bar>
...