Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-DOMDocument/DOMConfiguration_Php_Dom_Namespaces_Normalization - Fatal编程技术网

PHP-DOMDocument/DOMConfiguration

PHP-DOMDocument/DOMConfiguration,php,dom,namespaces,normalization,Php,Dom,Namespaces,Normalization,如上所述,DOMConfiguration尚未实现。我需要规范化名称空间,以便只要提供前缀,子元素中的名称空间就会移动到根元素 有没有非regexp的方法可以做到这一点 通过,我不确定,如果这是可能的,但我甚至不能尝试它,因为你可以看到 也许有一种方法可以设置libxml 谢谢。好吧,正如我所评论的,我已经重写了我的代码,以处理DOM构建中的名称空间。这项工作如下: class Foo { const XMLNS = 'http://www.w3.org/2000/xmlns/';

如上所述,DOMConfiguration尚未实现。我需要规范化名称空间,以便只要提供前缀,子元素中的名称空间就会移动到根元素

有没有非regexp的方法可以做到这一点

通过,我不确定,如果这是可能的,但我甚至不能尝试它,因为你可以看到

也许有一种方法可以设置libxml


谢谢。

好吧,正如我所评论的,我已经重写了我的代码,以处理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:请将您的解决方案添加为答案(并接受它,是的,可以;)-如果您有一些示例代码,也可以随意添加,即使它只是示例性的,它经常说上千个字。