PHP-DOMDocument/DOMConfiguration
如上所述,DOMConfiguration尚未实现。我需要规范化名称空间,以便只要提供前缀,子元素中的名称空间就会移动到根元素 有没有非regexp的方法可以做到这一点 通过,我不确定,如果这是可能的,但我甚至不能尝试它,因为你可以看到 也许有一种方法可以设置libxmlPHP-DOMDocument/DOMConfiguration,php,dom,namespaces,normalization,Php,Dom,Namespaces,Normalization,如上所述,DOMConfiguration尚未实现。我需要规范化名称空间,以便只要提供前缀,子元素中的名称空间就会移动到根元素 有没有非regexp的方法可以做到这一点 通过,我不确定,如果这是可能的,但我甚至不能尝试它,因为你可以看到 也许有一种方法可以设置libxml 谢谢。好吧,正如我所评论的,我已经重写了我的代码,以处理DOM构建中的名称空间。这项工作如下: class Foo { const XMLNS = 'http://www.w3.org/2000/xmlns/';
谢谢。好吧,正如我所评论的,我已经重写了我的代码,以处理DOM构建中的名称空间。这项工作如下:
class Foo {
const XMLNS = 'http://www.w3.org/2000/xmlns/';
/**
* Register a namespace with an optional prefix to the specified DOMElement.
*
* @param DOMElement $element
* @param string $namespaceUri
* @param string $prefix
*/
public static final function registerNS(DOMElement $element, $namespaceUri, $prefix=null) {
Preconditions::checkNotEmpty($namespaceUri);
$name = "xmlns";
if (!empty($prefix)) {
$name .= ":$prefix";
}
$element->setAttributeNS(self::XMLNS, $name, $namespaceUri);
}
}
现在,每当我添加一个元素作为另一个元素的子元素时(这里说everytime,让事情变得更简单),我调用这个方法,主要是提供documentElement作为第一个参数,将名称空间添加到根元素:
DOMDocument $doc = [...];
DOMElement $element = [...];
DOMElement $newChild = [...];
Foo::registerNS($doc->documentElement, $newChild->namespaceURI, $newChild->prefix);
$element->appendChild($newChild);
为了澄清:默认情况下不会这样做吗?您可以考虑向XSLTREST进行脱壳,您可以通过选择候选节点并进行必要的更改W/DOM API。此外,您还可以通过第二个参数访问et al(不确定它们是否有用,但这就是您可以指定它们的地方)。非常感谢。但是,我已经更改了应用程序,以非常严格的方式处理DOM构建中的名称空间。因此,不再需要进行清理。另外:只清除节点之间的空白字符,这样子节点的迭代就不需要检查文本节点。@user498380:请将您的解决方案添加为答案(并接受它,是的,可以;)-如果您有一些示例代码,也可以随意添加,即使它只是示例性的,它经常说上千个字。