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

3 php namespaces simplexml addchild

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

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

<?xml version="1.0" encoding="UTF-8"?>
  <ns1:a xmlns:ns1="http://www.abc.com">
</ns1:a>
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

问题 - 正如评论所述 - 如果我想在父元素中放置一个没有命名空间的子元素和命名空间,我每次都会得到一个空的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>
Run Code Online (Sandbox Code Playgroud)

虽然Web浏览器和XML解析器(例如Xerces)似乎都不介意这个多余的标记,但我发现它有点令人讨厌,我似乎无法告诉它停止这样做.

任何人都有解决方案,还是我反应过度?

:}

rik*_*rik 5

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

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

但是,您无法注入其他名称空间,例如addAttribute.在由SimpleXML解析之前,您必须操纵输入文件.对我来说,这似乎比从输出中删除所有空xmlns属性更难看.