使用 XMLWriter 跟踪命名空间声明

发布于 2024-07-23 12:30:03 字数 330 浏览 3 评论 0原文

我正在开发一个 XML Web 服务(在 PHP 中!),为了“正确”地做事情,我想使用 XMLWriter 而不是仅仅连接字符串并希望得到最好的结果。

我使用 ->startElementNS 和 ->writeElementNS 到处使用 XML 命名空间。 问题是,每次我使用这些函数时,也会写入一个新的名称空间声明。

虽然这是正确的语法,但有点不必要。 我想确保我的命名空间声明仅在第一次在文档上下文中使用时写入。

有没有一种简单的方法可以使用 XMLWriter 来解决这个问题,或者我是否坚持子类化它并手动管理它。

谢谢, 翻转

I'm working on an XML webservice (in PHP!), and in order to do things 'right', I want to use XMLWriter instead of just concatinating strings and hoping for the best.

I'm using XML namespaces everywhere using ->startElementNS and ->writeElementNS. The problem, is that every time I use these functions a new namespace declaration is also writting.

While this is correct syntax, it's a bit unneeded. I'd like to make sure my namespace declaration is only written the first time it's used in the context of a document.

Is there an easy way to go about this with XMLWriter, or am I stuck subclassing this and managing this manually.

Thanks,
Evert

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不喜欢何必死缠烂打 2024-07-30 12:30:04

您可以在文档中的所需位置写出名称空间,例如在顶部元素中:

$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。 同样令人烦恼的是,该属性是必需的,即使它可以为空 - 而且它是第三个参数,而不是最后一个。

2c 美元,
*-派克

You can write out the namespace once in the desired location in the document, f.e. in the top element:

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

This should end up something like

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

It is sort of annoying xmlwriter doesnt keep track of those declarations - it allows you write invalid xml. It's also annoying the attribute is required, even if it can be null - and that its the third argument, not the last.

$2c,
*-pike

他是夢罘是命 2024-07-30 12:30:04

您可以传递 NULL 作为 uri 参数。

<?php
$w = new XMLWriter;
$w->openMemory();
$w->setIndent(true);
$w->startElementNS('foo', 'bar', 'http://whatever/foo');
$w->startElementNS('foo', 'baz', null);
$w->endElement();
$w->endElement();
echo $w->outputMemory();

prints

<foo:bar xmlns:foo="http://whatever/foo">
 <foo:baz/>
</foo:bar>

You can pass NULL as the uri parameter.

<?php
$w = new XMLWriter;
$w->openMemory();
$w->setIndent(true);
$w->startElementNS('foo', 'bar', 'http://whatever/foo');
$w->startElementNS('foo', 'baz', null);
$w->endElement();
$w->endElement();
echo $w->outputMemory();

prints

<foo:bar xmlns:foo="http://whatever/foo">
 <foo:baz/>
</foo:bar>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文