PHP SimpleXML->addChild - 不需要的空命名空间属性

Posted

技术标签:

【中文标题】PHP SimpleXML->addChild - 不需要的空命名空间属性【英文标题】:PHP SimpleXML->addChild - unwanted empty namespace attribute 【发布时间】:2011-06-08 00:30:05 【问题描述】:

我正在尝试使用 SimpleXML 的 SimpleXMLElement 的 addChild 方法(实际上是 SimpleXMLIterator,它是 SimpleXMLElement 的子类)来添加子元素。

我的问题是源文档包含有命名空间和没有命名空间的混合元素。这是一个简单(没有双关语)的例子:

<?xml version="1.0" encoding="UTF-8"?>
  <ns1:a xmlns:ns1="http://www.abc.com">
</ns1:a>

php代码是:

$it = new SimpleXMLIterator ('./test.xml', 0, true);
$it->addChild('d', 'another!'); // adds new child element to parent's NS
$it->addChild('c', 'no namespace for me!', ''); // puts xmlns="" every time :(

//output xml in response:
header('Content-Type: text/xml');

echo $it->saveXML();

问题 - 正如评论所述 - 是如果我想在具有命名空间的父元素内放置一个没有命名空间的子元素,我每次都会得到一个空的 XML 命名空间属性(上述 PHP 代码的输出):

<?xml version="1.0" encoding="UTF-8"?>
  <ns1:a xmlns:ns1="http://www.abc.com">
  <ns1:d>another!</ns1:d>
  <c xmlns="">no namespace for me!</c>
</ns1:a>

虽然 Web 浏览器和 XML 解析器(例如 Xerces)似乎都不介意这种多余的标记,但我觉得有点烦人,我似乎无法告诉它停止这样做。

有人有解决方案还是我反应过度了?

:

【问题讨论】:

【参考方案1】:

对于 SimpleXML,c 需要一个命名空间。如果您指定一个,它会获得一个 xmlns 属性,因为您指定的内容之前没有被声明过。如果不为 c 指定命名空间,它会从父节点继承命名空间。这里唯一的选择是ns1。 (这发生在 d 身上。)

为了防止继承父命名空间省略空的xmlns,您需要在父命名空间中使用类似xmlns="http://example.com" 的命名空间。然后$it-&gt;addChild('c', 'no ns', 'http://example.com') 给你&lt;c&gt;no ns&lt;/c&gt;

但是你不能注入额外的命名空间,例如与addAttribute。您必须在 SimpleXML 解析输入文件之前对其进行操作。对我来说,这似乎比从输出中删除所有空的 xmlns 属性更难看。

【讨论】:

Rik,虽然它仍然需要我有一个命名空间,但您的解决方案似乎很合适——尤其是在我处理 html 时。感谢您的及时回复和答复,非常感谢。 :D

以上是关于PHP SimpleXML->addChild - 不需要的空命名空间属性的主要内容,如果未能解决你的问题,请参考以下文章

PHP SimpleXML + 获取属性

SimpleXML和PHP错误处理-Tumblr RSS示例

使用 PHP 的 SimpleXML 访问元素的父级?

PHP 的 SimpleXML:如何在名称中使用冒号

从 PHP SimpleXML 节点获取实际值 [重复]

PHP simpleXML如何以格式化的方式保存文件?