PHP - DOMDocument/DOMConfiguration

Posted

技术标签:

【中文标题】PHP - DOMDocument/DOMConfiguration【英文标题】: 【发布时间】:2012-01-10 12:12:46 【问题描述】:

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

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

不过,我不确定DOMConfiguration 是否可以做到这一点,但我什至无法尝试,如您所见。

也许有办法通过设置 libxml?

谢谢。

【问题讨论】:

为了澄清:DOMDocument::normalizeDocument 默认不会这样做? 你可以考虑使用 xslt 您当然可以通过DOMXPath 选择候选节点并使用标准DOM API 进行必要的更改。此外,您可以通过DOMDocument::load 等的第二个参数访问libxml settings(不确定它们是否会有所帮助,但您可以在此处指定它们)。 加载功能在这里似乎很有帮助。谢谢你。但是,我已经更改了应用程序,以非常严格的方式处理 DOM 上的命名空间。因此不再需要清理。另外:DOMDocument::normalizeDocument 只清理节点之间的空白字符,因此通过子节点的迭代不需要您检查文本节点。 @user498380:请添加您的解决方案作为答案(并接受它,是的,它有效;)) - 如果您有一些示例代码,也可以随意添加它,甚至如果只是示范,它通常会说一千多个单词。 【参考方案1】:

好吧,正如评论所说,我已经重写了我的代码,以处理 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的主要内容,如果未能解决你的问题,请参考以下文章

php send.php php邮件模板#php

IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?

如何从php5升级到php7

请问php中如何调用php文件中的内容?

php [php:PHPMailer示例] php库“PHPMailer”示例。 #PHP

php基础