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

标签 php namespaces simplexml addchild

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

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

<?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();

问题 - 如评论所述 - 是如果我想在具有 namespace 的父元素内放置一个没有 namespace 的子元素,我每次都会得到一个空的 XML namespace 属性(上述 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>

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

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

:

最佳答案

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

为防止继承父命名空间省略空xmlns你需要一个类似 xmlns="http://example.com" 的命名空间在父级。然后 $it->addChild('c', 'no ns', 'http://example.com')给你<c>no ns</c> .

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

关于PHP SimpleXML->addChild - 不需要的空命名空间属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4672274/

相关文章:

php - 是否可以将 SimpleXML 对象转换为 PHP 中的 DOMDocument 对象?

php - simplexml_load_file结果为空页

php - 上传后转换视频

javascript - 同时发送两个 AJAX 请求

java - 将命名空间设置为 @XmlRootElement 时解码失败且没有错误

php - 在命名空间类中使用非命名空间类的最佳实践是什么

php - SimpleXML 仅解析顶层

javascript - 社交网络帖子未发送到数据库

php - 使用 PHP 为 couchDB 创建 View

c# - 继承具有相同命名空间和相同类名的类