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

有没有非正则表达式的方法来做到这一点?

通过,我不确定,这是否可以通过 DOMConfiguration 实现,但我什至无法如您所见。

也许有设置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);
   }
}

现在,每次(在这里说每次,为了让事情变得更容易)我添加一个元素作为另一个元素的子元素,我调用这个方法并且主要提供 documentElement 作为第一个参数来向根元素添加命名空间:
DOMDocument $doc = [...];
DOMElement $element = [...];
DOMElement $newChild = [...];
Foo::registerNS($doc->documentElement, $newChild->namespaceURI, $newChild->prefix);
$element->appendChild($newChild);

关于PHP - DOMDocument/DOMConfiguration,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8339835/

10-10 04:52