PHP - DOM文档/DOM配置

发布于 2024-12-19 05:51:18 字数 260 浏览 1 评论 0原文

如所述

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

通过,我不确定这是否可能通过 DOMConfiguration 但我什至无法尝试它,如你所见。

也许有办法通过设置 libxml 来实现?

谢谢。

as stated here the DOMConfiguration is not yet implemented. I need to normalize the namespaces, so that namespaces in child elements will be moved to the root element as long as prefixes are provided.

Is there any non-regexp way to do this?

Through, I am not sure, if this is even possible by DOMConfiguration but I was not even able to try it as you can see.

Maybe there is a way by setting up the libxml?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

离线来电— 2024-12-26 05:51:18

好吧,正如所评论的,我已经重写了我的代码,以处理 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);

Well, as commented I have rewritten my code, to take care of namespaces on DOM build-up. This works as follows:

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);
   }
}

Now, everytime (saying everytime here, to make things easier now) I add an element as a child of another element, I call this method and mostly provide the documentElement as the first parameter to add namespaces to the root element:

DOMDocument $doc = [...];
DOMElement $element = [...];
DOMElement $newChild = [...];
Foo::registerNS($doc->documentElement, $newChild->namespaceURI, $newChild->prefix);
$element->appendChild($newChild);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文